diff --git a/Gemfile b/Gemfile index 56c861fb1b6d6fe1fad66afc2cd4148ffea26f14..1b885f5d685d15dcd0433fef8b6bbae0fd905ef7 100644 --- a/Gemfile +++ b/Gemfile @@ -2,8 +2,9 @@ source "https://rubygems.org" ruby "2.2.0" +gem 'administrate', path: "administrate" + gem "airbrake" -gem "bourbon", "~> 4.1.0" gem "coffee-rails", "~> 4.1.0" gem "delayed_job_active_record" gem "email_validator" @@ -12,7 +13,6 @@ gem "flutie" gem "high_voltage" gem "i18n-tasks" gem "jquery-rails" -gem "neat", "~> 1.7.0" gem "newrelic_rpm" gem "normalize-rails", "~> 3.0.0" gem "pg" @@ -32,7 +32,6 @@ group :development do end group :development, :test do - gem "ammeter" gem "awesome_print" gem "bundler-audit", require: false gem "byebug" diff --git a/Gemfile.lock b/Gemfile.lock index afbc1a1f2955f3125dfe7c86eba477b366f9e47a..6685b3b70eb926956dc05c13cf14f48f464ed399 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,10 @@ +PATH + remote: administrate + specs: + administrate (0.0.1) + neat (~> 1.7.0) + rails (~> 4.2.0) + GEM remote: https://rubygems.org/ specs: @@ -277,10 +284,10 @@ PLATFORMS ruby DEPENDENCIES + administrate! airbrake ammeter awesome_print - bourbon (~> 4.1.0) bundler-audit byebug capybara-webkit (>= 1.2.0) @@ -298,7 +305,6 @@ DEPENDENCIES i18n-tasks jquery-rails launchy - neat (~> 1.7.0) newrelic_rpm normalize-rails (~> 3.0.0) pg diff --git a/administrate/.gitignore b/administrate/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/administrate/Gemfile b/administrate/Gemfile new file mode 100644 index 0000000000000000000000000000000000000000..6ec93d1ab2bcda8e998f47edb584f6b3a811e7bb --- /dev/null +++ b/administrate/Gemfile @@ -0,0 +1,14 @@ +source 'https://rubygems.org' + +# Declare your gem's dependencies in administrate.gemspec. +# Bundler will treat runtime dependencies like base dependencies, and +# development dependencies will be added by default to the :development group. +gemspec + +# Declare any dependencies that are still in development here instead of in +# your gemspec. These might include edge Rails or gems from your path or +# Git. Remember to move these dependencies to your gemspec before releasing +# your gem to rubygems.org. + +# To use a debugger +# gem 'byebug', group: [:development, :test] diff --git a/administrate/Gemfile.lock b/administrate/Gemfile.lock new file mode 100644 index 0000000000000000000000000000000000000000..f1f9e04fe7d9468d213a7c1a33c408ce818d7dda --- /dev/null +++ b/administrate/Gemfile.lock @@ -0,0 +1,106 @@ +PATH + remote: . + specs: + administrate (0.0.1) + rails (~> 4.2.0) + +GEM + remote: https://rubygems.org/ + specs: + actionmailer (4.2.1) + actionpack (= 4.2.1) + actionview (= 4.2.1) + activejob (= 4.2.1) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 1.0, >= 1.0.5) + actionpack (4.2.1) + actionview (= 4.2.1) + activesupport (= 4.2.1) + rack (~> 1.6) + rack-test (~> 0.6.2) + rails-dom-testing (~> 1.0, >= 1.0.5) + rails-html-sanitizer (~> 1.0, >= 1.0.1) + actionview (4.2.1) + activesupport (= 4.2.1) + builder (~> 3.1) + erubis (~> 2.7.0) + rails-dom-testing (~> 1.0, >= 1.0.5) + rails-html-sanitizer (~> 1.0, >= 1.0.1) + activejob (4.2.1) + activesupport (= 4.2.1) + globalid (>= 0.3.0) + activemodel (4.2.1) + activesupport (= 4.2.1) + builder (~> 3.1) + activerecord (4.2.1) + activemodel (= 4.2.1) + activesupport (= 4.2.1) + arel (~> 6.0) + activesupport (4.2.1) + i18n (~> 0.7) + json (~> 1.7, >= 1.7.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + arel (6.0.0) + builder (3.2.2) + erubis (2.7.0) + globalid (0.3.5) + activesupport (>= 4.1.0) + i18n (0.7.0) + json (1.8.3) + loofah (2.0.2) + nokogiri (>= 1.5.9) + mail (2.6.3) + mime-types (>= 1.16, < 3) + mime-types (2.6.1) + mini_portile (0.6.2) + minitest (5.7.0) + nokogiri (1.6.6.2) + mini_portile (~> 0.6.0) + rack (1.6.1) + rack-test (0.6.3) + rack (>= 1.0) + rails (4.2.1) + actionmailer (= 4.2.1) + actionpack (= 4.2.1) + actionview (= 4.2.1) + activejob (= 4.2.1) + activemodel (= 4.2.1) + activerecord (= 4.2.1) + activesupport (= 4.2.1) + bundler (>= 1.3.0, < 2.0) + railties (= 4.2.1) + sprockets-rails + rails-deprecated_sanitizer (1.0.3) + activesupport (>= 4.2.0.alpha) + rails-dom-testing (1.0.6) + activesupport (>= 4.2.0.beta, < 5.0) + nokogiri (~> 1.6.0) + rails-deprecated_sanitizer (>= 1.0.1) + rails-html-sanitizer (1.0.2) + loofah (~> 2.0) + railties (4.2.1) + actionpack (= 4.2.1) + activesupport (= 4.2.1) + rake (>= 0.8.7) + thor (>= 0.18.1, < 2.0) + rake (10.4.2) + sprockets (3.2.0) + rack (~> 1.0) + sprockets-rails (2.3.1) + actionpack (>= 3.0) + activesupport (>= 3.0) + sprockets (>= 2.8, < 4.0) + sqlite3 (1.3.10) + thor (0.19.1) + thread_safe (0.3.5) + tzinfo (1.2.2) + thread_safe (~> 0.1) + +PLATFORMS + ruby + +DEPENDENCIES + administrate! + sqlite3 diff --git a/administrate/MIT-LICENSE b/administrate/MIT-LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..5128c6027f2fb44897da2963126b2076b0381ef4 --- /dev/null +++ b/administrate/MIT-LICENSE @@ -0,0 +1,20 @@ +Copyright 2015 Grayson Wright + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/administrate/README.rdoc b/administrate/README.rdoc new file mode 100644 index 0000000000000000000000000000000000000000..865d63466aa48bbd87e79cd0dc831c4b321bd866 --- /dev/null +++ b/administrate/README.rdoc @@ -0,0 +1,3 @@ += Administrate + +This project rocks and uses MIT-LICENSE. \ No newline at end of file diff --git a/administrate/Rakefile b/administrate/Rakefile new file mode 100644 index 0000000000000000000000000000000000000000..5a306e8266cfe1c145e8c23eeec97fb963ccd200 --- /dev/null +++ b/administrate/Rakefile @@ -0,0 +1,37 @@ +begin + require 'bundler/setup' +rescue LoadError + puts 'You must `gem install bundler` and `bundle install` to run rake tasks' +end + +require 'rdoc/task' + +RDoc::Task.new(:rdoc) do |rdoc| + rdoc.rdoc_dir = 'rdoc' + rdoc.title = 'Administrate' + rdoc.options << '--line-numbers' + rdoc.rdoc_files.include('README.rdoc') + rdoc.rdoc_files.include('lib/**/*.rb') +end + +APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__) +load 'rails/tasks/engine.rake' + + +load 'rails/tasks/statistics.rake' + + + +Bundler::GemHelper.install_tasks + +require 'rake/testtask' + +Rake::TestTask.new(:test) do |t| + t.libs << 'lib' + t.libs << 'test' + t.pattern = 'test/**/*_test.rb' + t.verbose = false +end + + +task default: :test diff --git a/administrate/administrate.gemspec b/administrate/administrate.gemspec new file mode 100644 index 0000000000000000000000000000000000000000..356075b48f474de05c2f7e4205812ecbe1e66224 --- /dev/null +++ b/administrate/administrate.gemspec @@ -0,0 +1,24 @@ +$:.push File.expand_path("../lib", __FILE__) + +# Maintain your gem's version: +require "administrate/version" + +# Describe your gem and declare its dependencies: +Gem::Specification.new do |s| + s.name = "administrate" + s.version = Administrate::VERSION + s.authors = ["Grayson Wright"] + s.email = ["grayson@thoughtbot.com"] + s.homepage = "TODO" + s.summary = "TODO: Summary of Administrate." + s.description = "TODO: Description of Administrate." + s.license = "MIT" + + s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"] + s.test_files = Dir["test/**/*"] + + s.add_dependency "rails", "~> 4.2.0" + s.add_dependency "neat", "~> 1.7.0" + + s.add_development_dependency "sqlite3" +end diff --git a/administrate/app/assets/images/administrate/.keep b/administrate/app/assets/images/administrate/.keep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/administrate/app/assets/javascripts/administrate/application.js b/administrate/app/assets/javascripts/administrate/application.js new file mode 100644 index 0000000000000000000000000000000000000000..a707e052e588ac91ce66fd51f0e52d3172226791 --- /dev/null +++ b/administrate/app/assets/javascripts/administrate/application.js @@ -0,0 +1,3 @@ +//= require jquery +//= require jquery_ujs +//= require_tree . diff --git a/app/assets/javascripts/components/table.js b/administrate/app/assets/javascripts/administrate/components/table.js similarity index 100% rename from app/assets/javascripts/components/table.js rename to administrate/app/assets/javascripts/administrate/components/table.js diff --git a/app/assets/stylesheets/_sidebar.scss b/administrate/app/assets/stylesheets/administrate/_sidebar.scss similarity index 100% rename from app/assets/stylesheets/_sidebar.scss rename to administrate/app/assets/stylesheets/administrate/_sidebar.scss diff --git a/app/assets/stylesheets/application.css.scss b/administrate/app/assets/stylesheets/administrate/application.scss similarity index 90% rename from app/assets/stylesheets/application.css.scss rename to administrate/app/assets/stylesheets/administrate/application.scss index 0439767dc7a253515fca6a5a5d56723d27c99ada..7ce94e52226aee3d54436bd28431d6416fcf7294 100644 --- a/app/assets/stylesheets/application.css.scss +++ b/administrate/app/assets/stylesheets/administrate/application.scss @@ -6,7 +6,6 @@ @import "neat"; @import "mixins/mixins"; @import "base/base"; -@import "refills/flashes"; @import "layout"; @import "sidebar"; diff --git a/app/assets/stylesheets/base/_base.scss b/administrate/app/assets/stylesheets/administrate/base/_base.scss similarity index 100% rename from app/assets/stylesheets/base/_base.scss rename to administrate/app/assets/stylesheets/administrate/base/_base.scss diff --git a/app/assets/stylesheets/base/_buttons.scss b/administrate/app/assets/stylesheets/administrate/base/_buttons.scss similarity index 100% rename from app/assets/stylesheets/base/_buttons.scss rename to administrate/app/assets/stylesheets/administrate/base/_buttons.scss diff --git a/app/assets/stylesheets/base/_forms.scss b/administrate/app/assets/stylesheets/administrate/base/_forms.scss similarity index 100% rename from app/assets/stylesheets/base/_forms.scss rename to administrate/app/assets/stylesheets/administrate/base/_forms.scss diff --git a/app/assets/stylesheets/base/_grid-settings.scss b/administrate/app/assets/stylesheets/administrate/base/_grid-settings.scss similarity index 100% rename from app/assets/stylesheets/base/_grid-settings.scss rename to administrate/app/assets/stylesheets/administrate/base/_grid-settings.scss diff --git a/app/assets/stylesheets/base/_lists.scss b/administrate/app/assets/stylesheets/administrate/base/_lists.scss similarity index 100% rename from app/assets/stylesheets/base/_lists.scss rename to administrate/app/assets/stylesheets/administrate/base/_lists.scss diff --git a/app/assets/stylesheets/base/_tables.scss b/administrate/app/assets/stylesheets/administrate/base/_tables.scss similarity index 100% rename from app/assets/stylesheets/base/_tables.scss rename to administrate/app/assets/stylesheets/administrate/base/_tables.scss diff --git a/app/assets/stylesheets/base/_typography.scss b/administrate/app/assets/stylesheets/administrate/base/_typography.scss similarity index 100% rename from app/assets/stylesheets/base/_typography.scss rename to administrate/app/assets/stylesheets/administrate/base/_typography.scss diff --git a/app/assets/stylesheets/base/_variables.scss b/administrate/app/assets/stylesheets/administrate/base/_variables.scss similarity index 100% rename from app/assets/stylesheets/base/_variables.scss rename to administrate/app/assets/stylesheets/administrate/base/_variables.scss diff --git a/app/assets/stylesheets/base/extends/_button.scss b/administrate/app/assets/stylesheets/administrate/base/extends/_button.scss similarity index 100% rename from app/assets/stylesheets/base/extends/_button.scss rename to administrate/app/assets/stylesheets/administrate/base/extends/_button.scss diff --git a/app/assets/stylesheets/base/extends/_clearfix.scss b/administrate/app/assets/stylesheets/administrate/base/extends/_clearfix.scss similarity index 100% rename from app/assets/stylesheets/base/extends/_clearfix.scss rename to administrate/app/assets/stylesheets/administrate/base/extends/_clearfix.scss diff --git a/app/assets/stylesheets/base/extends/_errors.scss b/administrate/app/assets/stylesheets/administrate/base/extends/_errors.scss similarity index 100% rename from app/assets/stylesheets/base/extends/_errors.scss rename to administrate/app/assets/stylesheets/administrate/base/extends/_errors.scss diff --git a/app/assets/stylesheets/base/extends/_flashes.scss b/administrate/app/assets/stylesheets/administrate/base/extends/_flashes.scss similarity index 100% rename from app/assets/stylesheets/base/extends/_flashes.scss rename to administrate/app/assets/stylesheets/administrate/base/extends/_flashes.scss diff --git a/app/assets/stylesheets/base/extends/_hide-text.scss b/administrate/app/assets/stylesheets/administrate/base/extends/_hide-text.scss similarity index 100% rename from app/assets/stylesheets/base/extends/_hide-text.scss rename to administrate/app/assets/stylesheets/administrate/base/extends/_hide-text.scss diff --git a/app/assets/stylesheets/components/_components.scss b/administrate/app/assets/stylesheets/administrate/components/_components.scss similarity index 100% rename from app/assets/stylesheets/components/_components.scss rename to administrate/app/assets/stylesheets/administrate/components/_components.scss diff --git a/app/assets/stylesheets/components/_form.scss b/administrate/app/assets/stylesheets/administrate/components/_form.scss similarity index 100% rename from app/assets/stylesheets/components/_form.scss rename to administrate/app/assets/stylesheets/administrate/components/_form.scss diff --git a/app/assets/stylesheets/components/_header.scss b/administrate/app/assets/stylesheets/administrate/components/_header.scss similarity index 100% rename from app/assets/stylesheets/components/_header.scss rename to administrate/app/assets/stylesheets/administrate/components/_header.scss diff --git a/app/assets/stylesheets/components/_table.scss b/administrate/app/assets/stylesheets/administrate/components/_table.scss similarity index 100% rename from app/assets/stylesheets/components/_table.scss rename to administrate/app/assets/stylesheets/administrate/components/_table.scss diff --git a/app/assets/stylesheets/layout.scss b/administrate/app/assets/stylesheets/administrate/layout.scss similarity index 100% rename from app/assets/stylesheets/layout.scss rename to administrate/app/assets/stylesheets/administrate/layout.scss diff --git a/app/assets/stylesheets/mixins/_mixins.scss b/administrate/app/assets/stylesheets/administrate/mixins/_mixins.scss similarity index 100% rename from app/assets/stylesheets/mixins/_mixins.scss rename to administrate/app/assets/stylesheets/administrate/mixins/_mixins.scss diff --git a/app/assets/stylesheets/mixins/_shadow.scss b/administrate/app/assets/stylesheets/administrate/mixins/_shadow.scss similarity index 100% rename from app/assets/stylesheets/mixins/_shadow.scss rename to administrate/app/assets/stylesheets/administrate/mixins/_shadow.scss diff --git a/administrate/app/controllers/administrate/application_controller.rb b/administrate/app/controllers/administrate/application_controller.rb new file mode 100644 index 0000000000000000000000000000000000000000..032f2b70328f51c62e24377efea8097c78d0e03d --- /dev/null +++ b/administrate/app/controllers/administrate/application_controller.rb @@ -0,0 +1,120 @@ +require "administrate/pages/form" +require "administrate/pages/table" +require "administrate/pages/show" + +module Administrate + class ApplicationController < ActionController::Base + def index + @resources = resource_class.all + @page = Administrate::Page::Table.new(dashboard) + end + + def show + set_resource + + @page = Administrate::Page::Show.new(dashboard, resource) + end + + def new + @page = Administrate::Page::Form.new(dashboard, resource_class.new) + end + + def edit + set_resource + + @page = Administrate::Page::Form.new(dashboard, resource) + end + + def create + set_resource(resource_class.new(resource_params)) + + if resource.save + redirect_to resource, notice: notices[:created] + else + @page = Administrate::Page::Form.new(dashboard, resource) + render :new + end + end + + def update + set_resource + + if resource.update(resource_params) + redirect_to resource, notice: notices[:updated] + else + @page = Administrate::Page::Form.new(dashboard, resource) + render :edit + end + end + + def destroy + set_resource + + resource.destroy + flash[:notice] = notices[:destroyed] + redirect_to action: :index + end + + private + + helper_method :link_class + def link_class(resource) + if resource_name.to_s.pluralize == resource.to_s + :active + end + end + + def resource_class + Object.const_get(resource_class_name) + end + + def dashboard + @dashboard ||= dashboard_class.new + end + + def set_resource(resource = nil) + resource ||= resource_class.find(params[:id]) + instance_variable_set(instance_variable, resource) + end + + def resource + instance_variable_get(instance_variable) + end + + def resource_params + params.require(:"#{resource_name}").permit(*permitted_attributes) + end + + def permitted_attributes + dashboard.permitted_attributes + end + + def dashboard_class + Object.const_get("#{resource_class_name}Dashboard") + end + + def resource_class_name + resource_name.to_s.camelcase + end + + def instance_variable + "@#{resource_name}" + end + + def resource_title + resource_class_name.titleize + end + + def notices + { + created: "#{resource_title} was successfully created.", + updated: "#{resource_title} was successfully updated.", + destroyed: "#{resource_title} was successfully destroyed.", + } + end + + def resource_name + controller_name.singularize.to_sym + end + end +end diff --git a/administrate/app/helpers/administrate/application_helper.rb b/administrate/app/helpers/administrate/application_helper.rb new file mode 100644 index 0000000000000000000000000000000000000000..6fcdde95306085989356124223645ffe98077d28 --- /dev/null +++ b/administrate/app/helpers/administrate/application_helper.rb @@ -0,0 +1,4 @@ +module Administrate + module ApplicationHelper + end +end diff --git a/administrate/app/views/administrate/application/_flashes.html.erb b/administrate/app/views/administrate/application/_flashes.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..fd9c3ccd13f8a6bbc2fb66cef6b5f44bebdbdc28 --- /dev/null +++ b/administrate/app/views/administrate/application/_flashes.html.erb @@ -0,0 +1,7 @@ +<% if flash.any? %> + <div id="flash"> + <% flash.each do |key, value| -%> + <div class="flash-<%= key %>"><%= value %></div> + <% end -%> + </div> +<% end %> diff --git a/app/views/dashboard/_form.html.erb b/administrate/app/views/administrate/application/_form.html.erb similarity index 100% rename from app/views/dashboard/_form.html.erb rename to administrate/app/views/administrate/application/_form.html.erb diff --git a/administrate/app/views/administrate/application/_javascript.html.erb b/administrate/app/views/administrate/application/_javascript.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..56fa84ad7c360bcb4fe26ef3474b89bcd3cd90a8 --- /dev/null +++ b/administrate/app/views/administrate/application/_javascript.html.erb @@ -0,0 +1,10 @@ +<%= javascript_include_tag "administrate/application" %> + +<%= yield :javascript %> + +<% if Rails.env.test? %> + <%= javascript_tag do %> + $.fx.off = true; + $.ajaxSetup({ async: false }); + <% end %> +<% end %> diff --git a/administrate/app/views/administrate/application/_sidebar.html.erb b/administrate/app/views/administrate/application/_sidebar.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..e5796d7e1668a15efa93c7fe85bd38f7b41b4ce5 --- /dev/null +++ b/administrate/app/views/administrate/application/_sidebar.html.erb @@ -0,0 +1,16 @@ +<ul class="sidebar-list"> + <div class="sidebar-logo"> + <%= image_tag "logo.svg" %> + <h1 class="sidebar-logo-heading">Administrate</h1> + </div> + + <% DashboardManifest.new.dashboards.each do |resource| %> + <li> + <%= link_to( + resource.to_s.titleize, + resource, + class: link_class(resource) + ) %> + </li> + <% end %> +</ul> diff --git a/app/views/dashboard/_table.html.erb b/administrate/app/views/administrate/application/_table.html.erb similarity index 100% rename from app/views/dashboard/_table.html.erb rename to administrate/app/views/administrate/application/_table.html.erb diff --git a/app/views/dashboard/edit.html.erb b/administrate/app/views/administrate/application/edit.html.erb similarity index 100% rename from app/views/dashboard/edit.html.erb rename to administrate/app/views/administrate/application/edit.html.erb diff --git a/app/views/dashboard/index.html.erb b/administrate/app/views/administrate/application/index.html.erb similarity index 100% rename from app/views/dashboard/index.html.erb rename to administrate/app/views/administrate/application/index.html.erb diff --git a/app/views/dashboard/new.html.erb b/administrate/app/views/administrate/application/new.html.erb similarity index 100% rename from app/views/dashboard/new.html.erb rename to administrate/app/views/administrate/application/new.html.erb diff --git a/app/views/dashboard/show.html.erb b/administrate/app/views/administrate/application/show.html.erb similarity index 100% rename from app/views/dashboard/show.html.erb rename to administrate/app/views/administrate/application/show.html.erb diff --git a/app/views/fields/form/_belongs_to.html.erb b/administrate/app/views/fields/form/_belongs_to.html.erb similarity index 100% rename from app/views/fields/form/_belongs_to.html.erb rename to administrate/app/views/fields/form/_belongs_to.html.erb diff --git a/app/views/fields/form/_email.html.erb b/administrate/app/views/fields/form/_email.html.erb similarity index 100% rename from app/views/fields/form/_email.html.erb rename to administrate/app/views/fields/form/_email.html.erb diff --git a/app/views/fields/form/_has_many.html.erb b/administrate/app/views/fields/form/_has_many.html.erb similarity index 100% rename from app/views/fields/form/_has_many.html.erb rename to administrate/app/views/fields/form/_has_many.html.erb diff --git a/app/views/fields/form/_image.html.erb b/administrate/app/views/fields/form/_image.html.erb similarity index 100% rename from app/views/fields/form/_image.html.erb rename to administrate/app/views/fields/form/_image.html.erb diff --git a/app/views/fields/form/_string.html.erb b/administrate/app/views/fields/form/_string.html.erb similarity index 100% rename from app/views/fields/form/_string.html.erb rename to administrate/app/views/fields/form/_string.html.erb diff --git a/app/views/fields/index/_belongs_to.html.erb b/administrate/app/views/fields/index/_belongs_to.html.erb similarity index 100% rename from app/views/fields/index/_belongs_to.html.erb rename to administrate/app/views/fields/index/_belongs_to.html.erb diff --git a/app/views/fields/index/_email.html.erb b/administrate/app/views/fields/index/_email.html.erb similarity index 100% rename from app/views/fields/index/_email.html.erb rename to administrate/app/views/fields/index/_email.html.erb diff --git a/app/views/fields/index/_has_many.html.erb b/administrate/app/views/fields/index/_has_many.html.erb similarity index 100% rename from app/views/fields/index/_has_many.html.erb rename to administrate/app/views/fields/index/_has_many.html.erb diff --git a/app/views/fields/index/_image.html.erb b/administrate/app/views/fields/index/_image.html.erb similarity index 100% rename from app/views/fields/index/_image.html.erb rename to administrate/app/views/fields/index/_image.html.erb diff --git a/app/views/fields/index/_string.html.erb b/administrate/app/views/fields/index/_string.html.erb similarity index 100% rename from app/views/fields/index/_string.html.erb rename to administrate/app/views/fields/index/_string.html.erb diff --git a/app/views/fields/show/_belongs_to.html.erb b/administrate/app/views/fields/show/_belongs_to.html.erb similarity index 100% rename from app/views/fields/show/_belongs_to.html.erb rename to administrate/app/views/fields/show/_belongs_to.html.erb diff --git a/app/views/fields/show/_email.html.erb b/administrate/app/views/fields/show/_email.html.erb similarity index 100% rename from app/views/fields/show/_email.html.erb rename to administrate/app/views/fields/show/_email.html.erb diff --git a/app/views/fields/show/_has_many.html.erb b/administrate/app/views/fields/show/_has_many.html.erb similarity index 100% rename from app/views/fields/show/_has_many.html.erb rename to administrate/app/views/fields/show/_has_many.html.erb diff --git a/app/views/fields/show/_image.html.erb b/administrate/app/views/fields/show/_image.html.erb similarity index 100% rename from app/views/fields/show/_image.html.erb rename to administrate/app/views/fields/show/_image.html.erb diff --git a/app/views/fields/show/_string.html.erb b/administrate/app/views/fields/show/_string.html.erb similarity index 100% rename from app/views/fields/show/_string.html.erb rename to administrate/app/views/fields/show/_string.html.erb diff --git a/administrate/app/views/layouts/administrate/application.html.erb b/administrate/app/views/layouts/administrate/application.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..9b13de5e4283d7c6dee6b535a391262819005799 --- /dev/null +++ b/administrate/app/views/layouts/administrate/application.html.erb @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8" /> + <meta name="ROBOTS" content="NOODP" /> + <meta name="viewport" content="initial-scale=1" /> + <title>Administrate</title> + <%= stylesheet_link_tag "//fonts.googleapis.com/css?family=Lato:300,400,900", media: "all" %> + <%= stylesheet_link_tag "administrate/application", media: "all" %> + <%= csrf_meta_tags %> +</head> + +<body class="<%= body_class %>"> + <main class="main"> + <div class="sidebar"> + <%= render "sidebar" -%> + </div> + + <div class="content"> + <%= render "flashes" -%> + + <%= yield %> + + <%= render "javascript" %> + </div> + </main> +</body> +</html> diff --git a/administrate/bin/rails b/administrate/bin/rails new file mode 100755 index 0000000000000000000000000000000000000000..98c954bef4915b40facfd07a370129d3a5e4c02a --- /dev/null +++ b/administrate/bin/rails @@ -0,0 +1,12 @@ +#!/usr/bin/env ruby +# This command will automatically be run when you run "rails" with Rails 4 gems installed from the root of your application. + +ENGINE_ROOT = File.expand_path('../..', __FILE__) +ENGINE_PATH = File.expand_path('../../lib/administrate/engine', __FILE__) + +# Set up gems listed in the Gemfile. +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) + +require 'rails/all' +require 'rails/engine/commands' diff --git a/administrate/config/routes.rb b/administrate/config/routes.rb new file mode 100644 index 0000000000000000000000000000000000000000..4e823e53a111beb197914dfb174da5418edbf872 --- /dev/null +++ b/administrate/config/routes.rb @@ -0,0 +1,2 @@ +Administrate::Engine.routes.draw do +end diff --git a/administrate/lib/administrate.rb b/administrate/lib/administrate.rb new file mode 100644 index 0000000000000000000000000000000000000000..a31181102aa2bf624ec17b3d37640272a181c4d8 --- /dev/null +++ b/administrate/lib/administrate.rb @@ -0,0 +1,4 @@ +require "administrate/engine" + +module Administrate +end diff --git a/administrate/lib/administrate/base_dashboard.rb b/administrate/lib/administrate/base_dashboard.rb new file mode 100644 index 0000000000000000000000000000000000000000..fdce961d2d3f32153c487eab93d39979de735a7b --- /dev/null +++ b/administrate/lib/administrate/base_dashboard.rb @@ -0,0 +1,33 @@ +require "administrate/fields/belongs_to" +require "administrate/fields/email" +require "administrate/fields/has_many" +require "administrate/fields/image" +require "administrate/fields/string" + +module Administrate + class BaseDashboard + def permitted_attributes + form_attributes.map do |attr| + field_class(attr).permitted_attribute(attr) + end.uniq + end + + def field_class(attr) + field_registry.fetch(attribute_types[attr]) + end + + private + + def field_registry + { + belongs_to: Administrate::Field::BelongsTo, + datetime: Administrate::Field::String, + email: Administrate::Field::Email, + has_many: Administrate::Field::HasMany, + image: Administrate::Field::Image, + integer: Administrate::Field::String, + string: Administrate::Field::String, + } + end + end +end diff --git a/administrate/lib/administrate/engine.rb b/administrate/lib/administrate/engine.rb new file mode 100644 index 0000000000000000000000000000000000000000..d83e10385c952fb43a178b94d906757d6c0d8e77 --- /dev/null +++ b/administrate/lib/administrate/engine.rb @@ -0,0 +1,7 @@ +require "neat" + +module Administrate + class Engine < ::Rails::Engine + isolate_namespace Administrate + end +end diff --git a/administrate/lib/administrate/fields/base.rb b/administrate/lib/administrate/fields/base.rb new file mode 100644 index 0000000000000000000000000000000000000000..330b2de915449f143d53fa7102860cab64996929 --- /dev/null +++ b/administrate/lib/administrate/fields/base.rb @@ -0,0 +1,31 @@ +module Administrate + module Field + class Base + def initialize(attribute, data, page) + @attribute = attribute + @data = data + @page = page + end + + def self.permitted_attribute(attr) + attr + end + + def name + attribute.to_s + end + + def to_partial_path + "/fields/#{page}/#{field_name}" + end + + attr_reader :attribute, :data, :page + + protected + + def field_name + self.class.to_s.split("::").last.underscore + end + end + end +end diff --git a/administrate/lib/administrate/fields/belongs_to.rb b/administrate/lib/administrate/fields/belongs_to.rb new file mode 100644 index 0000000000000000000000000000000000000000..f23aef55f55256acdb5ccca7362aec0f412a13f4 --- /dev/null +++ b/administrate/lib/administrate/fields/belongs_to.rb @@ -0,0 +1,19 @@ +require_relative "base" + +module Administrate + module Field + class BelongsTo < Field::Base + def self.permitted_attribute(attr) + :"#{attr}_id" + end + + def permitted_attribute + self.class.permitted_attribute(attribute) + end + + def candidate_records + Object.const_get(attribute.to_s.camelcase).all + end + end + end +end diff --git a/administrate/lib/administrate/fields/email.rb b/administrate/lib/administrate/fields/email.rb new file mode 100644 index 0000000000000000000000000000000000000000..5d4d100fbfc7b625430a46571183151140ac8518 --- /dev/null +++ b/administrate/lib/administrate/fields/email.rb @@ -0,0 +1,8 @@ +require_relative "base" + +module Administrate + module Field + class Email < Field::Base + end + end +end diff --git a/administrate/lib/administrate/fields/has_many.rb b/administrate/lib/administrate/fields/has_many.rb new file mode 100644 index 0000000000000000000000000000000000000000..2830288b4cfc2a90b881f241bbc2eecc9c8f1b0f --- /dev/null +++ b/administrate/lib/administrate/fields/has_many.rb @@ -0,0 +1,38 @@ +require_relative "base" +require "administrate/pages/table" + +module Administrate + module Field + class HasMany < Field::Base + def associated_table + Administrate::Page::Table.new(associated_dashboard) + end + + def self.permitted_attribute(attribute) + { "#{attribute.to_s.singularize}_ids".to_sym => [] } + end + + def permitted_attribute + self.class.permitted_attribute(attribute) + end + + def attribute_key + permitted_attribute.keys.first + end + + def candidate_records + Object.const_get(resource_class_name).all + end + + private + + def associated_dashboard + Object.const_get("#{resource_class_name}Dashboard").new + end + + def resource_class_name + attribute.to_s.singularize.camelcase + end + end + end +end diff --git a/administrate/lib/administrate/fields/image.rb b/administrate/lib/administrate/fields/image.rb new file mode 100644 index 0000000000000000000000000000000000000000..3589634926f201f0983fef82d0cf17d5f0483aed --- /dev/null +++ b/administrate/lib/administrate/fields/image.rb @@ -0,0 +1,8 @@ +require_relative "base" + +module Administrate + module Field + class Image < Field::Base + end + end +end diff --git a/administrate/lib/administrate/fields/string.rb b/administrate/lib/administrate/fields/string.rb new file mode 100644 index 0000000000000000000000000000000000000000..662735728e70a28b916283245ae61c779caf18b2 --- /dev/null +++ b/administrate/lib/administrate/fields/string.rb @@ -0,0 +1,8 @@ +require_relative "base" + +module Administrate + module Field + class String < Field::Base + end + end +end diff --git a/administrate/lib/administrate/pages/base.rb b/administrate/lib/administrate/pages/base.rb new file mode 100644 index 0000000000000000000000000000000000000000..708e802109afd3cf58002604e8dd5a29320cdfd9 --- /dev/null +++ b/administrate/lib/administrate/pages/base.rb @@ -0,0 +1,28 @@ +module Administrate + module Page + class Base + def initialize(dashboard) + @dashboard = dashboard + end + + def resource_name + @resource_name ||= + dashboard.class.to_s.scan(/(.+)Dashboard/).first.first.underscore + end + + protected + + def attribute_field(dashboard, resource, attribute_name, page) + value = resource.public_send(attribute_name) + + dashboard. + field_class(attribute_name). + new(attribute_name, value, page) + end + + protected + + attr_reader :dashboard + end + end +end diff --git a/administrate/lib/administrate/pages/form.rb b/administrate/lib/administrate/pages/form.rb new file mode 100644 index 0000000000000000000000000000000000000000..1b5bfdaee0ff2acc1b14a31c6144954f93f21cbc --- /dev/null +++ b/administrate/lib/administrate/pages/form.rb @@ -0,0 +1,28 @@ +require_relative "base" + +module Administrate + module Page + class Form < Page::Base + def initialize(dashboard, resource) + super(dashboard) + @resource = resource + end + + attr_reader :resource + + def attributes + dashboard.form_attributes.map do |attribute| + attribute_field(dashboard, resource, attribute, :form) + end + end + + def page_title + resource.to_s + end + + protected + + attr_reader :dashboard + end + end +end diff --git a/administrate/lib/administrate/pages/show.rb b/administrate/lib/administrate/pages/show.rb new file mode 100644 index 0000000000000000000000000000000000000000..d2ef938c5971288dcb44a1950c44f29f77bbde50 --- /dev/null +++ b/administrate/lib/administrate/pages/show.rb @@ -0,0 +1,24 @@ +require_relative "base" + +module Administrate + module Page + class Show < Page::Base + def initialize(dashboard, resource) + super(dashboard) + @resource = resource + end + + attr_reader :resource + + def page_title + resource.to_s + end + + def attributes + dashboard.show_page_attributes.map do |attr_name| + attribute_field(dashboard, resource, attr_name, :show) + end + end + end + end +end diff --git a/administrate/lib/administrate/pages/table.rb b/administrate/lib/administrate/pages/table.rb new file mode 100644 index 0000000000000000000000000000000000000000..0fec66d499947a84ab4ed510542e600567e89a21 --- /dev/null +++ b/administrate/lib/administrate/pages/table.rb @@ -0,0 +1,21 @@ +require_relative "base" + +module Administrate + module Page + class Table < Page::Base + def attribute_names + dashboard.table_attributes + end + + def attributes_for(resource) + attribute_names.map do |attr_name| + attribute_field(dashboard, resource, attr_name, :index) + end + end + + def to_partial_path + "/dashboard/table" + end + end + end +end diff --git a/administrate/lib/administrate/version.rb b/administrate/lib/administrate/version.rb new file mode 100644 index 0000000000000000000000000000000000000000..b610831ac16fb914d776c307696472ae0a603b55 --- /dev/null +++ b/administrate/lib/administrate/version.rb @@ -0,0 +1,3 @@ +module Administrate + VERSION = "0.0.1" +end diff --git a/administrate/lib/tasks/administrate_tasks.rake b/administrate/lib/tasks/administrate_tasks.rake new file mode 100644 index 0000000000000000000000000000000000000000..8541acdbd65bf33b61e90be4f20712b23a685656 --- /dev/null +++ b/administrate/lib/tasks/administrate_tasks.rake @@ -0,0 +1,4 @@ +# desc "Explaining what the task does" +# task :administrate do +# # Task goes here +# end diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css new file mode 100644 index 0000000000000000000000000000000000000000..f9cd5b34830b8b6fc6c33449c2dd0b32c6b79d85 --- /dev/null +++ b/app/assets/stylesheets/application.css @@ -0,0 +1,15 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, + * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any styles + * defined in the other CSS/SCSS files in this directory. It is generally better to create a new + * file per style scope. + * + *= require_tree . + *= require_self + */ diff --git a/app/assets/stylesheets/refills/_flashes.scss b/app/assets/stylesheets/refills/_flashes.scss deleted file mode 100644 index a78b46a7245a01eca6ce1810f87524610d5ae795..0000000000000000000000000000000000000000 --- a/app/assets/stylesheets/refills/_flashes.scss +++ /dev/null @@ -1,40 +0,0 @@ -$base-spacing: 1.5em !default; -$alert-color: #fff6bf !default; -$error-color: #fbe3e4 !default; -$notice-color: #e5edf8 !default; -$success-color: #e6efc2 !default; - -@mixin flash($color) { - background-color: $color; - color: darken($color, 60%); - display: block; - font-weight: 600; - margin-bottom: $base-spacing / 2; - padding: $base-spacing / 2; - text-align: center; - - a { - color: darken($color, 70%); - - &:focus, - &:hover { - color: darken($color, 90%); - } - } -} - -.flash-alert { - @include flash($alert-color); -} - -.flash-error { - @include flash($error-color); -} - -.flash-notice { - @include flash($notice-color); -} - -.flash-success { - @include flash($success-color); -} diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index 3ed8e198f4c6fb468909578e90450955854251a3..bcd93fd7c8e02cd27279d62d8ce95d4ab0579cd3 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,2 +1,2 @@ -class CustomersController < DashboardController +class CustomersController < Administrate::ApplicationController end diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb deleted file mode 100644 index 6c8149bb17d26497a896f76696cf3799c19987bf..0000000000000000000000000000000000000000 --- a/app/controllers/dashboard_controller.rb +++ /dev/null @@ -1,117 +0,0 @@ -require "pages/form" -require "pages/table" -require "pages/show" - -class DashboardController < ApplicationController - def index - @resources = resource_class.all - @page = Page::Table.new(dashboard) - end - - def show - set_resource(resource_class.find(params[:id])) - - @page = Page::Show.new(dashboard, resource) - end - - def new - @page = Page::Form.new(dashboard, resource_class.new) - end - - def edit - set_resource(resource_class.find(params[:id])) - - @page = Page::Form.new(dashboard, resource) - end - - def create - set_resource(resource_class.new(resource_params)) - - if resource.save - redirect_to resource, notice: notices[:created] - else - @page = Page::Form.new(dashboard, resource) - render :new - end - end - - def update - set_resource(resource_class.find(params[:id])) - - if resource.update(resource_params) - redirect_to resource, notice: notices[:updated] - else - @page = Page::Form.new(dashboard, resource) - render :edit - end - end - - def destroy - set_resource(resource_class.find(params[:id])) - - resource.destroy - flash[:notice] = notices[:destroyed] - redirect_to action: :index - end - - private - - helper_method :link_class - def link_class(resource) - if resource_name.to_s.pluralize == resource.to_s - :active - end - end - - def resource_class - Object.const_get(resource_class_name) - end - - def dashboard - @dashboard ||= dashboard_class.new - end - - def set_resource(value) - instance_variable_set(instance_variable, value) - end - - def resource - instance_variable_get(instance_variable) - end - - def resource_params - params.require(:"#{resource_name}").permit(*permitted_attributes) - end - - def permitted_attributes - dashboard.permitted_attributes - end - - def dashboard_class - Object.const_get("#{resource_class_name}Dashboard") - end - - def resource_class_name - resource_name.to_s.camelcase - end - - def instance_variable - "@#{resource_name}" - end - - def resource_title - resource_class_name.titleize - end - - def notices - { - created: "#{resource_title} was successfully created.", - updated: "#{resource_title} was successfully updated.", - destroyed: "#{resource_title} was successfully destroyed.", - } - end - - def resource_name - controller_name.singularize.to_sym - end -end diff --git a/app/controllers/line_items_controller.rb b/app/controllers/line_items_controller.rb index 426e8c3a2ecc7dd758499b45d055ba765b600600..d95e9cbdfa7a7aa1d1f4e598712868c1d6d3024e 100644 --- a/app/controllers/line_items_controller.rb +++ b/app/controllers/line_items_controller.rb @@ -1,2 +1,2 @@ -class LineItemsController < DashboardController +class LineItemsController < Administrate::ApplicationController end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb index a7807ce3a82a5559a949498dca747da3bff27abc..62079cc6c8cad6b0ffa1cc5f89dd4c091a06cd2d 100644 --- a/app/controllers/orders_controller.rb +++ b/app/controllers/orders_controller.rb @@ -1,2 +1,2 @@ -class OrdersController < DashboardController +class OrdersController < Administrate::ApplicationController end diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index d6d3aafbda7e12917b467956e0011e28bb1193d3..4d5b33879d7cd66ea42b09196dede9b24d2cd1a3 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -1,2 +1,2 @@ -class ProductsController < DashboardController +class ProductsController < Administrate::ApplicationController end diff --git a/app/dashboards/customer_dashboard.rb b/app/dashboards/customer_dashboard.rb index 6564956c48f9dd06af8669aa0f498be5a5fc154c..25f7993d90a102232d1fd749073093d4aec93809 100644 --- a/app/dashboards/customer_dashboard.rb +++ b/app/dashboards/customer_dashboard.rb @@ -1,6 +1,6 @@ -require "base_dashboard" +require "administrate/base_dashboard" -class CustomerDashboard < BaseDashboard +class CustomerDashboard < Administrate::BaseDashboard def attribute_types { created_at: :datetime, diff --git a/app/dashboards/line_item_dashboard.rb b/app/dashboards/line_item_dashboard.rb index 4a5be1f8b78d86c1da89c74958d4e706907fc7d4..1f23c13cac4f407ab25a1ceb22dcafa8b84e4e70 100644 --- a/app/dashboards/line_item_dashboard.rb +++ b/app/dashboards/line_item_dashboard.rb @@ -1,6 +1,6 @@ -require "base_dashboard" +require "administrate/base_dashboard" -class LineItemDashboard < BaseDashboard +class LineItemDashboard < Administrate::BaseDashboard def table_attributes attributes + [:total_price] end diff --git a/app/dashboards/order_dashboard.rb b/app/dashboards/order_dashboard.rb index a1e30c02e6c7ea56cafe70ec9caf1ee693d99288..070b95619fba18185ae2374db5e42008e9f30ede 100644 --- a/app/dashboards/order_dashboard.rb +++ b/app/dashboards/order_dashboard.rb @@ -1,6 +1,6 @@ -require "base_dashboard" +require "administrate/base_dashboard" -class OrderDashboard < BaseDashboard +class OrderDashboard < Administrate::BaseDashboard def attribute_types { id: :string, diff --git a/app/dashboards/product_dashboard.rb b/app/dashboards/product_dashboard.rb index d8e6728a1cb89c006b51e3db5a2be8dba509e846..a93cfa9bd8de809d439db8ce66a9af7f090e5443 100644 --- a/app/dashboards/product_dashboard.rb +++ b/app/dashboards/product_dashboard.rb @@ -1,6 +1,6 @@ -require "base_dashboard" +require "administrate/base_dashboard" -class ProductDashboard < BaseDashboard +class ProductDashboard < Administrate::BaseDashboard def attribute_types { description: :string, diff --git a/app/views/application/_javascript.html.erb b/app/views/application/_javascript.html.erb index a738f79975a910a21ad14a203e1265c47605770a..56fa84ad7c360bcb4fe26ef3474b89bcd3cd90a8 100644 --- a/app/views/application/_javascript.html.erb +++ b/app/views/application/_javascript.html.erb @@ -1,9 +1,7 @@ -<%= javascript_include_tag :application %> +<%= javascript_include_tag "administrate/application" %> <%= yield :javascript %> -<%= render "analytics" %> - <% if Rails.env.test? %> <%= javascript_tag do %> $.fx.off = true; diff --git a/app/views/refills/_flashes.html.erb b/app/views/refills/_flashes.html.erb deleted file mode 100644 index 2152e05e7c89b1e9aaf9279170d6bb570a6adf8e..0000000000000000000000000000000000000000 --- a/app/views/refills/_flashes.html.erb +++ /dev/null @@ -1,15 +0,0 @@ -<div class="flash-success"> - <span>This is a success message <a href="#">with a link</a></span> -</div> - -<div class="flash-error"> - <span>This is an error message <a href="#">with a link</a></span> -</div> - -<div class="flash-notice"> - <span>This is an notice message <a href="#">with a link</a></span> -</div> - -<div class="flash-alert"> - <span>This is an alert message <a href="#">with a link</a></span> -</div> diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml index 49e85e35f71456ac69d2fcb7d429892fadccb880..d8b2314e1cf55ed03d3d732803a99091238d91b8 100644 --- a/config/i18n-tasks.yml +++ b/config/i18n-tasks.yml @@ -11,6 +11,7 @@ data: ignore_unused: - activerecord.* + - administrate.* - date.* - simple_form.* - time.* diff --git a/lib/base_dashboard.rb b/lib/base_dashboard.rb deleted file mode 100644 index aa252342b9fe7281f71282526abca09429942bd4..0000000000000000000000000000000000000000 --- a/lib/base_dashboard.rb +++ /dev/null @@ -1,31 +0,0 @@ -require "fields/belongs_to" -require "fields/email" -require "fields/has_many" -require "fields/image" -require "fields/string" - -class BaseDashboard - def permitted_attributes - form_attributes.map do |attr| - field_class(attr).permitted_attribute(attr) - end.uniq - end - - def field_class(attr) - field_registry.fetch(attribute_types[attr]) - end - - private - - def field_registry - { - belongs_to: Field::BelongsTo, - datetime: Field::String, - email: Field::Email, - has_many: Field::HasMany, - image: Field::Image, - integer: Field::String, - string: Field::String, - } - end -end diff --git a/lib/fields/base.rb b/lib/fields/base.rb deleted file mode 100644 index 0bac06f752036e9d78bdbbe48cf90a9602363070..0000000000000000000000000000000000000000 --- a/lib/fields/base.rb +++ /dev/null @@ -1,29 +0,0 @@ -module Field - class Base - def initialize(attribute, data, page) - @attribute = attribute - @data = data - @page = page - end - - def self.permitted_attribute(attr) - attr - end - - def name - attribute.to_s - end - - def to_partial_path - "/fields/#{page}/#{field_name}" - end - - attr_reader :attribute, :data, :page - - protected - - def field_name - self.class.to_s.split("::").last.underscore - end - end -end diff --git a/lib/fields/belongs_to.rb b/lib/fields/belongs_to.rb deleted file mode 100644 index b4ce3018abdaffb3c98e3793522c9bef8cec56b8..0000000000000000000000000000000000000000 --- a/lib/fields/belongs_to.rb +++ /dev/null @@ -1,17 +0,0 @@ -require_relative "base" - -module Field - class BelongsTo < Field::Base - def self.permitted_attribute(attr) - :"#{attr}_id" - end - - def permitted_attribute - self.class.permitted_attribute(attribute) - end - - def candidate_records - Object.const_get(attribute.to_s.camelcase).all - end - end -end diff --git a/lib/fields/email.rb b/lib/fields/email.rb deleted file mode 100644 index f186391571057a8e2afd15cbf3e82b44cb654440..0000000000000000000000000000000000000000 --- a/lib/fields/email.rb +++ /dev/null @@ -1,6 +0,0 @@ -require_relative "base" - -module Field - class Email < Field::Base - end -end diff --git a/lib/fields/has_many.rb b/lib/fields/has_many.rb deleted file mode 100644 index 44a59fc198c0213e94a1abb2559f5c6317b17604..0000000000000000000000000000000000000000 --- a/lib/fields/has_many.rb +++ /dev/null @@ -1,36 +0,0 @@ -require_relative "base" -require "pages/table" - -module Field - class HasMany < Field::Base - def associated_table - Page::Table.new(associated_dashboard) - end - - def self.permitted_attribute(attribute) - { "#{attribute.to_s.singularize}_ids".to_sym => [] } - end - - def permitted_attribute - self.class.permitted_attribute(attribute) - end - - def attribute_key - permitted_attribute.keys.first - end - - def candidate_records - Object.const_get(resource_class_name).all - end - - private - - def associated_dashboard - Object.const_get("#{resource_class_name}Dashboard").new - end - - def resource_class_name - attribute.to_s.singularize.camelcase - end - end -end diff --git a/lib/fields/image.rb b/lib/fields/image.rb deleted file mode 100644 index c5ee1d746654374b5e4471920218de5620ef597d..0000000000000000000000000000000000000000 --- a/lib/fields/image.rb +++ /dev/null @@ -1,6 +0,0 @@ -require_relative "base" - -module Field - class Image < Field::Base - end -end diff --git a/lib/fields/string.rb b/lib/fields/string.rb deleted file mode 100644 index 63fad164fc1b30047e9da02e4de719c27c584db9..0000000000000000000000000000000000000000 --- a/lib/fields/string.rb +++ /dev/null @@ -1,6 +0,0 @@ -require_relative "base" - -module Field - class String < Field::Base - end -end diff --git a/lib/generators/dashboard/USAGE b/lib/generators/administrate/dashboard/USAGE similarity index 100% rename from lib/generators/dashboard/USAGE rename to lib/generators/administrate/dashboard/USAGE diff --git a/lib/generators/administrate/dashboard/dashboard_generator.rb b/lib/generators/administrate/dashboard/dashboard_generator.rb new file mode 100644 index 0000000000000000000000000000000000000000..db2c1382fa435dc754c31ecee920acf702a2b634 --- /dev/null +++ b/lib/generators/administrate/dashboard/dashboard_generator.rb @@ -0,0 +1,47 @@ +require "rails/generators/named_base" + +module Administrate + module Generators + class DashboardGenerator < Rails::Generators::NamedBase + source_root File.expand_path("../templates", __FILE__) + + def create_dashboard_definition + template "dashboard.rb.erb", "app/dashboards/#{file_name}_dashboard.rb" + end + + def create_resource_controller + template( + "controller.rb.erb", + "app/controllers/admin/#{file_name.pluralize}_controller.rb" + ) + end + + private + + def attributes + klass.attribute_names + klass.reflections.keys + end + + def field_type(attribute) + klass.type_for_attribute(attribute).type || + association_type(attribute) + end + + def association_type(attribute) + reflection = klass.reflections[attribute.to_s] + if reflection.collection? + :has_many + elsif reflection.belongs_to? + :belongs_to + else + throw "Unknown association type: #{reflection.inspect}\n" + + "Please open an issue on the Administrate repo." + end + end + + def klass + @klass ||= Object.const_get(class_name) + end + end + end +end diff --git a/lib/generators/dashboard/templates/controller.rb.erb b/lib/generators/administrate/dashboard/templates/controller.rb.erb similarity index 100% rename from lib/generators/dashboard/templates/controller.rb.erb rename to lib/generators/administrate/dashboard/templates/controller.rb.erb diff --git a/lib/generators/dashboard/templates/dashboard.rb.erb b/lib/generators/administrate/dashboard/templates/dashboard.rb.erb similarity index 100% rename from lib/generators/dashboard/templates/dashboard.rb.erb rename to lib/generators/administrate/dashboard/templates/dashboard.rb.erb diff --git a/lib/generators/administrate/install/install_generator.rb b/lib/generators/administrate/install/install_generator.rb new file mode 100644 index 0000000000000000000000000000000000000000..e82fe99a6153240a4ef2bb6659e07ef0627cd425 --- /dev/null +++ b/lib/generators/administrate/install/install_generator.rb @@ -0,0 +1,48 @@ +Rails.application.eager_load! +require "rails/generators/base" + +module Administrate + module Generators + class InstallGenerator < Rails::Generators::Base + source_root File.expand_path("../templates", __FILE__) + + def create_dashboard_controller + copy_file( + "dashboard_controller.rb", + "app/controllers/admin/dashboard_controller.rb" + ) + end + + def create_dashboard_manifest + template( + "dashboard_manifest.rb.erb", + "app/dashboards/dashboard_manifest.rb" + ) + end + + def insert_dashboard_routes + route(dashboard_routes) + end + + private + + def dashboard_resources + database_models.map do |model_class| + model_class.to_s.pluralize.underscore + end + end + + def database_models + ActiveRecord::Base.descendants + end + + def dashboard_routes + File.read(routes_file_path) + end + + def routes_file_path + File.expand_path(find_in_source_paths("routes.rb")) + end + end + end +end diff --git a/lib/generators/install/templates/dashboard_controller.rb b/lib/generators/administrate/install/templates/dashboard_controller.rb similarity index 80% rename from lib/generators/install/templates/dashboard_controller.rb rename to lib/generators/administrate/install/templates/dashboard_controller.rb index 980d545558f0f009ef1a8803e29a22441dacc7a3..206571d007fcfcfac5846d0b24d1f12dcbe7b3bc 100644 --- a/lib/generators/install/templates/dashboard_controller.rb +++ b/lib/generators/administrate/install/templates/dashboard_controller.rb @@ -4,9 +4,7 @@ # # If you want to add pagination or other controller-level concerns, # you're free to overwrite the RESTful controller actions. -class Admin::DashboardController < ApplicationController - include Adminsitrate::RestActions - +class Admin::DashboardController < Administrate::ApplicationController before_filter :authenticate_admin def authenticate_admin diff --git a/lib/generators/install/templates/dashboard_manifest.rb.erb b/lib/generators/administrate/install/templates/dashboard_manifest.rb.erb similarity index 100% rename from lib/generators/install/templates/dashboard_manifest.rb.erb rename to lib/generators/administrate/install/templates/dashboard_manifest.rb.erb diff --git a/lib/generators/install/templates/routes.rb b/lib/generators/administrate/install/templates/routes.rb similarity index 100% rename from lib/generators/install/templates/routes.rb rename to lib/generators/administrate/install/templates/routes.rb diff --git a/lib/generators/dashboard/dashboard_generator.rb b/lib/generators/dashboard/dashboard_generator.rb deleted file mode 100644 index dcbbebb4e4bb13b4b2b36a3c9b8b51845c6250e2..0000000000000000000000000000000000000000 --- a/lib/generators/dashboard/dashboard_generator.rb +++ /dev/null @@ -1,41 +0,0 @@ -class DashboardGenerator < Rails::Generators::NamedBase - source_root File.expand_path("../templates", __FILE__) - - def create_dashboard_definition - template "dashboard.rb.erb", "app/dashboards/#{file_name}_dashboard.rb" - end - - def create_resource_controller - template( - "controller.rb.erb", - "app/controllers/admin/#{file_name.pluralize}_controller.rb" - ) - end - - private - - def attributes - klass.attribute_names + klass.reflections.keys - end - - def field_type(attribute) - klass.type_for_attribute(attribute).type || - association_type(attribute) - end - - def association_type(attribute) - reflection = klass.reflections[attribute.to_s] - if reflection.collection? - :has_many - elsif reflection.belongs_to? - :belongs_to - else - throw "Unknown association type: #{reflection.inspect}\n" + - "Please open an issue on the Administrate repo." - end - end - - def klass - @klass ||= Object.const_get(class_name) - end -end diff --git a/lib/generators/install/install_generator.rb b/lib/generators/install/install_generator.rb deleted file mode 100644 index 6b44b0f3069242253101ac0e1e8e2f8faa6ddc2c..0000000000000000000000000000000000000000 --- a/lib/generators/install/install_generator.rb +++ /dev/null @@ -1,43 +0,0 @@ -Rails.application.eager_load! - -class InstallGenerator < Rails::Generators::Base - source_root File.expand_path("../templates", __FILE__) - - def create_dashboard_controller - copy_file( - "dashboard_controller.rb", - "app/controllers/admin/dashboard_controller.rb" - ) - end - - def create_dashboard_manifest - template( - "dashboard_manifest.rb.erb", - "app/dashboards/dashboard_manifest.rb" - ) - end - - def insert_dashboard_routes - route(dashboard_routes) - end - - private - - def dashboard_resources - database_models.map do |model_class| - model_class.to_s.pluralize.underscore - end - end - - def database_models - ActiveRecord::Base.descendants - end - - def dashboard_routes - File.read(routes_file_path) - end - - def routes_file_path - File.expand_path(find_in_source_paths("routes.rb")) - end -end diff --git a/lib/pages/base.rb b/lib/pages/base.rb deleted file mode 100644 index de53bf8461b28bb6ca3130a7e1747d71682bde5f..0000000000000000000000000000000000000000 --- a/lib/pages/base.rb +++ /dev/null @@ -1,26 +0,0 @@ -module Page - class Base - def initialize(dashboard) - @dashboard = dashboard - end - - def resource_name - @resource_name ||= - dashboard.class.to_s.scan(/(.+)Dashboard/).first.first.underscore - end - - protected - - def attribute_field(dashboard, resource, attribute_name, page) - value = resource.public_send(attribute_name) - - dashboard. - field_class(attribute_name). - new(attribute_name, value, page) - end - - protected - - attr_reader :dashboard - end -end diff --git a/lib/pages/form.rb b/lib/pages/form.rb deleted file mode 100644 index eea67705090be3d2557fa532fe935116935c1e50..0000000000000000000000000000000000000000 --- a/lib/pages/form.rb +++ /dev/null @@ -1,26 +0,0 @@ -require_relative "base" - -module Page - class Form < Page::Base - def initialize(dashboard, resource) - super(dashboard) - @resource = resource - end - - attr_reader :resource - - def attributes - dashboard.form_attributes.map do |attribute| - attribute_field(dashboard, resource, attribute, :form) - end - end - - def page_title - resource.to_s - end - - protected - - attr_reader :dashboard - end -end diff --git a/lib/pages/show.rb b/lib/pages/show.rb deleted file mode 100644 index e224d8f711950e0ea728b9430c2bec986dc23abe..0000000000000000000000000000000000000000 --- a/lib/pages/show.rb +++ /dev/null @@ -1,22 +0,0 @@ -require_relative "base" - -module Page - class Show < Page::Base - def initialize(dashboard, resource) - super(dashboard) - @resource = resource - end - - attr_reader :resource - - def page_title - resource.to_s - end - - def attributes - dashboard.show_page_attributes.map do |attr_name| - attribute_field(dashboard, resource, attr_name, :show) - end - end - end -end diff --git a/lib/pages/table.rb b/lib/pages/table.rb deleted file mode 100644 index dc39bade18d250ce076c6751ab01b24239900dd6..0000000000000000000000000000000000000000 --- a/lib/pages/table.rb +++ /dev/null @@ -1,19 +0,0 @@ -require_relative "base" - -module Page - class Table < Page::Base - def attribute_names - dashboard.table_attributes - end - - def attributes_for(resource) - attribute_names.map do |attr_name| - attribute_field(dashboard, resource, attr_name, :index) - end - end - - def to_partial_path - "/dashboard/table" - end - end -end diff --git a/spec/controllers/customers_controller_spec.rb b/spec/controllers/customers_controller_spec.rb index 246b7d16db91565a42e1915869509f5e79a4068a..eb206fd115c4454b97d52a6ab24f8bc1b545a66a 100644 --- a/spec/controllers/customers_controller_spec.rb +++ b/spec/controllers/customers_controller_spec.rb @@ -1,7 +1,6 @@ require 'rails_helper' -RSpec.describe CustomersController, type: :controller do - +describe CustomersController, type: :controller do describe "GET index" do it "assigns all customers as @resources" do customer = create(:customer) @@ -26,7 +25,7 @@ RSpec.describe CustomersController, type: :controller do it "assigns a new form page object as @page" do get :new - expect(assigns(:page)).to be_instance_of(Page::Form) + expect(assigns(:page)).to be_instance_of(Administrate::Page::Form) end end diff --git a/spec/dashboards/customer_dashboard_spec.rb b/spec/dashboards/customer_dashboard_spec.rb index 4c36039bbb7906fad388527d05d7c1e09555000d..556f6c3b5a90398e7cac1c1276e495733504e081 100644 --- a/spec/dashboards/customer_dashboard_spec.rb +++ b/spec/dashboards/customer_dashboard_spec.rb @@ -1,6 +1,6 @@ require "rails_helper" -RSpec.describe CustomerDashboard do +describe CustomerDashboard do describe "#table_attributes" do it "includes the name and email" do dashboard = CustomerDashboard.new diff --git a/spec/generators/dashboard_generator_spec.rb b/spec/generators/dashboard_generator_spec.rb index 92efd58776c5e60d25fd51b11a22daa541249174..946981dd3a0cb53deea3661ec8351b8d72c7e4c5 100644 --- a/spec/generators/dashboard_generator_spec.rb +++ b/spec/generators/dashboard_generator_spec.rb @@ -1,7 +1,7 @@ require "rails_helper" -require "generators/dashboard/dashboard_generator" +require "generators/administrate/dashboard/dashboard_generator" -describe DashboardGenerator, :generator do +describe Administrate::Generators::DashboardGenerator, :generator do describe "dashboard definition file" do it "has valid syntax" do dashboard = file("app/dashboards/customer_dashboard.rb") diff --git a/spec/generators/install_generator_spec.rb b/spec/generators/install_generator_spec.rb index 901979568a78b12307aefc5cdddbdec01cb9fb4b..753b6d3eeaa5a1b051d432ab6dec6ea34b852aca 100644 --- a/spec/generators/install_generator_spec.rb +++ b/spec/generators/install_generator_spec.rb @@ -1,8 +1,8 @@ require "spec_helper" -require "generators/install/install_generator" +require "generators/administrate/install/install_generator" require "support/generator_spec_helpers" -describe InstallGenerator, :generator do +describe Administrate::Generators::InstallGenerator, :generator do describe "dashboard_controller" do it "is copied to the application" do provide_existing_routes_file @@ -13,7 +13,7 @@ describe InstallGenerator, :generator do expect(controller).to exist expect(controller).to have_correct_syntax expect(controller).to contain( - "class Admin::DashboardController < ApplicationController" + "class Admin::DashboardController < Administrate::ApplicationController" ) end end diff --git a/spec/lib/fields/belongs_to_spec.rb b/spec/lib/fields/belongs_to_spec.rb index 00736001224ab22437c62455875ecb54607aae3c..001bfc6e907f5d88ab98d75fb68f9225f70326ed 100644 --- a/spec/lib/fields/belongs_to_spec.rb +++ b/spec/lib/fields/belongs_to_spec.rb @@ -1,12 +1,12 @@ require "spec_helper" -require "fields/belongs_to" +require "administrate/fields/belongs_to" -describe Field::BelongsTo do +describe Administrate::Field::BelongsTo do describe "#to_partial_path" do it "returns a partial based on the page being rendered" do page = :show owner = double - field = Field::BelongsTo.new(:owner, owner, page) + field = Administrate::Field::BelongsTo.new(:owner, owner, page) path = field.to_partial_path diff --git a/spec/lib/fields/email_spec.rb b/spec/lib/fields/email_spec.rb index 879d87ff6cfe85a142dd86d33e097139bb57c0f3..9a6f0026bb0cfb8a480a9e1b4f42d024a805f7e9 100644 --- a/spec/lib/fields/email_spec.rb +++ b/spec/lib/fields/email_spec.rb @@ -1,11 +1,11 @@ require "spec_helper" -require "fields/email" +require "administrate/fields/email" -describe Field::Email do +describe Administrate::Field::Email do describe "#to_partial_path" do it "returns a partial based on the page being rendered" do page = :show - field = Field::Email.new(:email, "foo@example.com", page) + field = Administrate::Field::Email.new(:email, "foo@example.com", page) path = field.to_partial_path diff --git a/spec/lib/fields/has_many_spec.rb b/spec/lib/fields/has_many_spec.rb index 640411f8c27fd713bcc4a3af86c004104d0dad9c..6b74773709413d20c94bcb2bffdf71a9b3be5929 100644 --- a/spec/lib/fields/has_many_spec.rb +++ b/spec/lib/fields/has_many_spec.rb @@ -1,12 +1,12 @@ require "spec_helper" -require "fields/has_many" +require "administrate/fields/has_many" -describe Field::HasMany do +describe Administrate::Field::HasMany do describe "#to_partial_path" do it "returns a partial based on the page being rendered" do page = :show items = double - field = Field::HasMany.new(:items, items, page) + field = Administrate::Field::HasMany.new(:items, items, page) path = field.to_partial_path @@ -17,11 +17,11 @@ describe Field::HasMany do describe "#associated_table" do it "returns an index page for the dashboard of the associated attribute" do orders = [] - field = Field::HasMany.new(:orders, orders, :show) + field = Administrate::Field::HasMany.new(:orders, orders, :show) page = field.associated_table - expect(page).to be_instance_of(Page::Table) + expect(page).to be_instance_of(Administrate::Page::Table) end end end diff --git a/spec/lib/fields/image_spec.rb b/spec/lib/fields/image_spec.rb index a1dceb68acd19479b95d6167b2a8931484a5f297..a39d1c9bbb2860176578c2b0a95f59c85fccbb28 100644 --- a/spec/lib/fields/image_spec.rb +++ b/spec/lib/fields/image_spec.rb @@ -1,11 +1,11 @@ require "spec_helper" -require "fields/image" +require "administrate/fields/image" -describe Field::Image do +describe Administrate::Field::Image do describe "#to_partial_path" do it "returns a partial based on the page being rendered" do page = :show - field = Field::Image.new(:image, "/a.jpg", page) + field = Administrate::Field::Image.new(:image, "/a.jpg", page) path = field.to_partial_path diff --git a/spec/lib/fields/string_spec.rb b/spec/lib/fields/string_spec.rb index ac9439ba068ffdcc50d7b6341ae644568a2dd686..188deecb893c8c2cc5423bc67bb3df497d6adc3b 100644 --- a/spec/lib/fields/string_spec.rb +++ b/spec/lib/fields/string_spec.rb @@ -1,11 +1,11 @@ require "spec_helper" -require "fields/string" +require "administrate/fields/string" -describe Field::String do +describe Administrate::Field::String do describe "#to_partial_path" do it "returns a partial based on the page being rendered" do page = :show - field = Field::String.new(:string, "hello", page) + field = Administrate::Field::String.new(:string, "hello", page) path = field.to_partial_path diff --git a/spec/lib/pages/form_spec.rb b/spec/lib/pages/form_spec.rb index 4f518dfd497660387af267c835e1ba6dc4b050b9..d4a32c739235afe46b35b2ae1680a8c04b149521 100644 --- a/spec/lib/pages/form_spec.rb +++ b/spec/lib/pages/form_spec.rb @@ -1,10 +1,10 @@ -require "pages/form" +require "administrate/pages/form" -describe Page::Form do +describe Administrate::Page::Form do describe "#page_title" do it "is the value of the resource's key attribute" do customer = double(to_s: "Worf") - page = Page::Form.new(CustomerDashboard.new, customer) + page = Administrate::Page::Form.new(CustomerDashboard.new, customer) expect(page.page_title).to eq("Worf") end diff --git a/spec/lib/pages/show_spec.rb b/spec/lib/pages/show_spec.rb index 731a64f0b7aacb18f3eb10d109524b0195ea3b1d..307880440e45d0963cadc0e06c551a043496639b 100644 --- a/spec/lib/pages/show_spec.rb +++ b/spec/lib/pages/show_spec.rb @@ -1,10 +1,10 @@ -require "pages/show" +require "administrate/pages/show" -describe Page::Show do +describe Administrate::Page::Show do describe "#page_title" do it "is the stringified resource" do customer = double(to_s: "Worf") - page = Page::Show.new(CustomerDashboard.new, customer) + page = Administrate::Page::Show.new(CustomerDashboard.new, customer) expect(page.page_title).to eq("Worf") end diff --git a/spec/lib/pages/table_spec.rb b/spec/lib/pages/table_spec.rb index e1f925c0914ac1a2d8186f5020d2243ca1d16565..a7233ca22c1d358ec67980feb62e32f79d797861 100644 --- a/spec/lib/pages/table_spec.rb +++ b/spec/lib/pages/table_spec.rb @@ -1,4 +1,4 @@ -require "pages/table" +require "administrate/pages/table" -describe Page::Table do +describe Administrate::Page::Table do end