diff --git a/app/views/administrate/application/_sidebar.html.erb b/app/views/administrate/application/_sidebar.html.erb index aa2a5fd7431661b1fff45ef951dd95cba9c98234..30832fe3ac7b22bbf776f13e4bbefb03933d57bf 100644 --- a/app/views/administrate/application/_sidebar.html.erb +++ b/app/views/administrate/application/_sidebar.html.erb @@ -12,7 +12,7 @@ as defined by the routes in the `admin/` namespace <li> <%= link_to( display_resource_name(resource), - [namespace, resource], + [namespace, resource.path], class: "sidebar__link sidebar__link--#{nav_link_state(resource)}" ) %> </li> diff --git a/app/views/administrate/application/index.html.erb b/app/views/administrate/application/index.html.erb index 1bab8de46026c3d8ce310bcaf1546f81098907d2..5ad0827b7ebfbb4522d82abead49c1d45c35458e 100644 --- a/app/views/administrate/application/index.html.erb +++ b/app/views/administrate/application/index.html.erb @@ -38,7 +38,7 @@ It renders the `_table` partial to display details about the resources. <div class="header__actions"> <%= link_to( "#{t("administrate.actions.new")} #{page.resource_name.titleize.downcase}", - [:new, namespace, page.resource_name], + [:new, namespace, page.resource_path], class: "button", ) if valid_action? :new %> </div> diff --git a/lib/administrate/engine.rb b/lib/administrate/engine.rb index c3419f3899fba9acfc1cae4de3c9f8a8cc644a38..d1f7ccc34e93bc2ac5518f051ce8183c24ff26c7 100644 --- a/lib/administrate/engine.rb +++ b/lib/administrate/engine.rb @@ -16,6 +16,7 @@ require "administrate/order" require "administrate/resource_resolver" require "administrate/search" require "administrate/namespace" +require "administrate/namespace/resource" module Administrate class Engine < ::Rails::Engine diff --git a/lib/administrate/namespace.rb b/lib/administrate/namespace.rb index 79ab2e7cc3a602030db24654500924130d90ac24..510fa3ac7adfd9c5c45a86744b087b150528c998 100644 --- a/lib/administrate/namespace.rb +++ b/lib/administrate/namespace.rb @@ -5,7 +5,9 @@ module Administrate end def resources - @resources ||= routes.map(&:first).uniq.map(&:to_sym) + @resources ||= routes.map(&:first).uniq.map do |path| + Resource.new(namespace, path) + end end def routes diff --git a/lib/administrate/namespace/resource.rb b/lib/administrate/namespace/resource.rb new file mode 100644 index 0000000000000000000000000000000000000000..19ab0213c730ac89796c1c6e924ebcc35039bce6 --- /dev/null +++ b/lib/administrate/namespace/resource.rb @@ -0,0 +1,28 @@ +module Administrate + class Namespace + class Resource + attr_reader :namespace, :resource + + def initialize(namespace, resource) + @namespace = namespace + @resource = resource + end + + def to_s + name.to_s + end + + def to_sym + name + end + + def name + resource.to_s.gsub(/^#{namespace}\//, "").to_sym + end + + def path + name.to_s.gsub("/", "_") + end + end + end +end diff --git a/lib/administrate/page/base.rb b/lib/administrate/page/base.rb index 4f5d52296c0b0672ee69d5aa422b422425911b18..00770ead692912c3936fc9678cd06d73e64ba591 100644 --- a/lib/administrate/page/base.rb +++ b/lib/administrate/page/base.rb @@ -11,6 +11,10 @@ module Administrate dashboard.class.to_s.scan(/(.+)Dashboard/).first.first.underscore end + def resource_path + @resource_path ||= resource_name.gsub("/", "_") + end + protected def attribute_field(dashboard, resource, attribute_name, page) diff --git a/spec/administrate/namespace_spec.rb b/spec/administrate/namespace_spec.rb index 22b69b4011e0b5693f7f77d3c3d611a06ac3241e..e790e7dc4ae3ce894b6140a561cc638f69134eb6 100644 --- a/spec/administrate/namespace_spec.rb +++ b/spec/administrate/namespace_spec.rb @@ -6,11 +6,12 @@ describe Administrate::Namespace do it "searches the routes for resources in the namespace" do begin namespace = Administrate::Namespace.new(:admin) + Rails.application.routes.draw do namespace(:admin) { resources :customers } end - expect(namespace.resources).to eq [:customers] + expect(namespace.resources.map(&:to_sym)).to eq [:customers] ensure reset_routes end diff --git a/spec/administrate/page/base_spec.rb b/spec/administrate/page/base_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..1cf3215b2f9f935c18c79f07ab89729abf9b41fc --- /dev/null +++ b/spec/administrate/page/base_spec.rb @@ -0,0 +1,36 @@ +require "rails_helper" +require "administrate/page/base" + +describe Administrate::Page::Base do + describe "#resource_name" do + it "returns a resource name from the dashboard" do + dashboard = OrderDashboard.new + dashboard_page = Administrate::Page::Base.new(dashboard) + + expect(dashboard_page.resource_name).to eq "order" + end + + it "returns a string for a namespaced resource path" do + dashboard = OrderDashboard.new + dashboard_page = Administrate::Page::Base.new(dashboard) + + expect(dashboard_page.resource_path).to eq "order" + end + + context "when provided a namespaced dashboard" do + it "returns a namespaced resource name from the dashboard" do + dashboard = Logged::OrderDashboard.new + dashboard_page = Administrate::Page::Base.new(dashboard) + + expect(dashboard_page.resource_name).to eq "logged/order" + end + + it "returns a string for a namespaced resource path" do + dashboard = Logged::OrderDashboard.new + dashboard_page = Administrate::Page::Base.new(dashboard) + + expect(dashboard_page.resource_path).to eq "logged_order" + end + end + end +end diff --git a/spec/example_app/app/dashboards/logged/order_dashboard.rb b/spec/example_app/app/dashboards/logged/order_dashboard.rb new file mode 100644 index 0000000000000000000000000000000000000000..a22ba98497cdbfdb5cf2f0bb0ae4dd21930026af --- /dev/null +++ b/spec/example_app/app/dashboards/logged/order_dashboard.rb @@ -0,0 +1,39 @@ +require "administrate/base_dashboard" + +module Logged + class OrderDashboard < Administrate::BaseDashboard + ATTRIBUTE_TYPES = { + id: Field::Number, + created_at: Field::DateTime, + updated_at: Field::DateTime, + address_line_one: Field::String, + address_line_two: Field::String, + address_city: Field::String, + address_state: Field::String, + address_zip: Field::String, + customer: Field::BelongsTo, + line_items: Field::HasMany, + total_price: Field::Number.with_options(prefix: "$", decimals: 2), + shipped_at: Field::DateTime, + } + + READ_ONLY_ATTRIBUTES = [ + :id, + :total_price, + :created_at, + :updated_at, + ] + + COLLECTION_ATTRIBUTES = [ + :id, + :customer, + :address_state, + :total_price, + :line_items, + :shipped_at, + ] + + FORM_ATTRIBUTES = ATTRIBUTE_TYPES.keys - READ_ONLY_ATTRIBUTES + SHOW_PAGE_ATTRIBUTES = ATTRIBUTE_TYPES.keys + end +end