From 8de1148ced67af1ea6de16bf5f97a446083c5f7c Mon Sep 17 00:00:00 2001 From: "Tianwen (Tian) Chen" Date: Thu, 14 Sep 2023 01:01:52 +1000 Subject: [PATCH] Extract pages into templates for better overwriting (#209) --- .../wallaby/resources/_edit_page.html.erb | 20 +++++++ .../wallaby/resources/_home_page.html.erb | 5 ++ .../wallaby/resources/_index_page.html.erb | 59 ++++++++++++++++++ .../wallaby/resources/_new_page.html.erb | 19 ++++++ .../wallaby/resources/_show_page.html.erb | 42 +++++++++++++ app/views/wallaby/resources/edit.html.erb | 21 +------ app/views/wallaby/resources/home.html.erb | 6 +- app/views/wallaby/resources/index.html.erb | 60 +------------------ .../wallaby/resources/index/_dollar.html.erb | 5 ++ .../wallaby/resources/index/_percent.html.erb | 10 ++++ app/views/wallaby/resources/new.html.erb | 20 +------ app/views/wallaby/resources/show.html.erb | 43 +------------ .../admin/categories_controller.rb | 6 ++ .../app/decorators/admin/product_decorator.rb | 5 ++ .../decorators/all_postgres_type_decorator.rb | 6 +- spec/dummy/app/models/person.rb | 1 + .../admin/categories/member_edit.html.erb | 21 ++++++- spec/dummy/config/database.yml | 4 +- spec/dummy/config/routes.rb | 7 ++- spec/dummy/db/schema.rb | 2 + spec/dummy/db/seeds.rb | 4 +- 21 files changed, 210 insertions(+), 156 deletions(-) create mode 100644 app/views/wallaby/resources/_edit_page.html.erb create mode 100644 app/views/wallaby/resources/_home_page.html.erb create mode 100644 app/views/wallaby/resources/_index_page.html.erb create mode 100644 app/views/wallaby/resources/_new_page.html.erb create mode 100644 app/views/wallaby/resources/_show_page.html.erb create mode 100644 app/views/wallaby/resources/index/_dollar.html.erb create mode 100644 app/views/wallaby/resources/index/_percent.html.erb create mode 100644 spec/dummy/app/decorators/admin/product_decorator.rb diff --git a/app/views/wallaby/resources/_edit_page.html.erb b/app/views/wallaby/resources/_edit_page.html.erb new file mode 100644 index 00000000..79036cfb --- /dev/null +++ b/app/views/wallaby/resources/_edit_page.html.erb @@ -0,0 +1,20 @@ +<% +# decorate first on every page or partial +decorated = decorate resource +%> +
+
+

<%= wt 'labels.edit', id: decorated.id %>

+ <%= render 'resource_navs' %> +
+ <%= render 'flash_messages' %> +
+
+ <%= form_for decorated, + url: url_for(action: :show), method: :put, + html: { :multipart => true } do |form| %> + <%= render 'form', form: form, decorated: decorated %> + <% end %> +
+
+
diff --git a/app/views/wallaby/resources/_home_page.html.erb b/app/views/wallaby/resources/_home_page.html.erb new file mode 100644 index 00000000..793ab204 --- /dev/null +++ b/app/views/wallaby/resources/_home_page.html.erb @@ -0,0 +1,5 @@ +

+ Welcome +

+<%# TODO: turn this page into intro maybe? %> +<%= render 'flash_messages' %> diff --git a/app/views/wallaby/resources/_index_page.html.erb b/app/views/wallaby/resources/_index_page.html.erb new file mode 100644 index 00000000..eb1eb9c7 --- /dev/null +++ b/app/views/wallaby/resources/_index_page.html.erb @@ -0,0 +1,59 @@ +<% +# decorate first on every page or partial +decorated_collection = decorate collection +%> +
+
+

<%= to_model_label(current_model_class) %>

+ <%= render 'index_query' %> + <%= render 'index_filters' %> + <%= render 'index_pagination' %> +
+ <%= render 'flash_messages' %> + +
+ <% # Data table %> + <% if decorated_collection.present? %> + <% field_names = current_model_decorator.index_field_names %> +
+ + + + <% field_names.each do |field_name| %> + <%= content_tag :th, class: sort_link_builder.current_sort[field_name] do %> + <%= sort_link_builder.build field_name %> + <% end %> + <% end %> + + + + + <% decorated_collection.each do |decorated| %> + + <% field_names.each do |field_name| %> + + <% end %> + + + <% end %> + +
 
+ <%= render decorated.index_type_of(field_name), + object: decorated, + field_name: field_name, + value: decorated.try(field_name), + metadata: decorated.index_metadata_of(field_name) + %> + + <%= render 'resource_actions', decorated: decorated %> +
+
+ <% else %> +
+ <%= image_tag 'wallaby/not_found.png' %> + <%= wt 'errors.not_found.collection' %> +
+ <% end %> + <% # /Data table %> +
+
diff --git a/app/views/wallaby/resources/_new_page.html.erb b/app/views/wallaby/resources/_new_page.html.erb new file mode 100644 index 00000000..ca3e4e4a --- /dev/null +++ b/app/views/wallaby/resources/_new_page.html.erb @@ -0,0 +1,19 @@ +<% decorated = decorate resource %> +
+
+

<%= wt 'labels.create', model: to_model_label(current_model_class) %>

+ <%= render 'resource_navs' %> +
+ <%= render 'flash_messages' %> +
+
+ <%= form_for( + decorated, + url: url_for(action: :index), method: :post, + html: { :multipart => true } + ) do |form| %> + <%= render 'form', form: form, decorated: decorated %> + <% end %> +
+
+
diff --git a/app/views/wallaby/resources/_show_page.html.erb b/app/views/wallaby/resources/_show_page.html.erb new file mode 100644 index 00000000..f1765568 --- /dev/null +++ b/app/views/wallaby/resources/_show_page.html.erb @@ -0,0 +1,42 @@ +
+ <% + if resource + # decorate first on every page or partial + decorated = decorate resource + %> +
+

<%= show_title decorated %>

+ <%= render 'resource_navs' %> +
+ <%= render 'flash_messages' %> +
+
+ <% decorated.show_field_names.each do |field_name| %> +
+
<%= decorated.show_label_of field_name %>
+
+ <%= render decorated.show_type_of(field_name), + object: decorated, + field_name: field_name, + value: decorated.try(field_name), + metadata: decorated.show_metadata_of(field_name) + %> +
+
+ <% end %> +
+
+ <% else %> +
+

<%= to_model_label(current_model_class) %>

+ <%= render 'resource_navs' %> +
+ <%= render 'flash_messages' %> +
+
+ <%= image_tag 'wallaby/not_found.png' %> + <%= wt 'errors.not_found.resource', resource: to_model_label(current_model_class) %> +
+
+ <% end %> +
diff --git a/app/views/wallaby/resources/edit.html.erb b/app/views/wallaby/resources/edit.html.erb index 79036cfb..b608879c 100644 --- a/app/views/wallaby/resources/edit.html.erb +++ b/app/views/wallaby/resources/edit.html.erb @@ -1,20 +1 @@ -<% -# decorate first on every page or partial -decorated = decorate resource -%> -
-
-

<%= wt 'labels.edit', id: decorated.id %>

- <%= render 'resource_navs' %> -
- <%= render 'flash_messages' %> -
-
- <%= form_for decorated, - url: url_for(action: :show), method: :put, - html: { :multipart => true } do |form| %> - <%= render 'form', form: form, decorated: decorated %> - <% end %> -
-
-
+<%= render 'edit_page' %> diff --git a/app/views/wallaby/resources/home.html.erb b/app/views/wallaby/resources/home.html.erb index 793ab204..252bedc8 100644 --- a/app/views/wallaby/resources/home.html.erb +++ b/app/views/wallaby/resources/home.html.erb @@ -1,5 +1 @@ -

- Welcome -

-<%# TODO: turn this page into intro maybe? %> -<%= render 'flash_messages' %> +<%= render 'home_page' %> diff --git a/app/views/wallaby/resources/index.html.erb b/app/views/wallaby/resources/index.html.erb index eb1eb9c7..8ac09d0f 100644 --- a/app/views/wallaby/resources/index.html.erb +++ b/app/views/wallaby/resources/index.html.erb @@ -1,59 +1 @@ -<% -# decorate first on every page or partial -decorated_collection = decorate collection -%> -
-
-

<%= to_model_label(current_model_class) %>

- <%= render 'index_query' %> - <%= render 'index_filters' %> - <%= render 'index_pagination' %> -
- <%= render 'flash_messages' %> - -
- <% # Data table %> - <% if decorated_collection.present? %> - <% field_names = current_model_decorator.index_field_names %> -
- - - - <% field_names.each do |field_name| %> - <%= content_tag :th, class: sort_link_builder.current_sort[field_name] do %> - <%= sort_link_builder.build field_name %> - <% end %> - <% end %> - - - - - <% decorated_collection.each do |decorated| %> - - <% field_names.each do |field_name| %> - - <% end %> - - - <% end %> - -
 
- <%= render decorated.index_type_of(field_name), - object: decorated, - field_name: field_name, - value: decorated.try(field_name), - metadata: decorated.index_metadata_of(field_name) - %> - - <%= render 'resource_actions', decorated: decorated %> -
-
- <% else %> -
- <%= image_tag 'wallaby/not_found.png' %> - <%= wt 'errors.not_found.collection' %> -
- <% end %> - <% # /Data table %> -
-
+<%= render 'index_page' %> diff --git a/app/views/wallaby/resources/index/_dollar.html.erb b/app/views/wallaby/resources/index/_dollar.html.erb new file mode 100644 index 00000000..c86bead2 --- /dev/null +++ b/app/views/wallaby/resources/index/_dollar.html.erb @@ -0,0 +1,5 @@ +<%# @param object [model] model instance %> +<%# @param field_name [String] name of the field %> +<%# @param value [Object] value of the field %> +<%# @param metadata [Hash] metadata of the field %> +<%= value.try { |v| number_to_currency(v, metadata[:dollar] || {}) } || null %> diff --git a/app/views/wallaby/resources/index/_percent.html.erb b/app/views/wallaby/resources/index/_percent.html.erb new file mode 100644 index 00000000..b65f80d4 --- /dev/null +++ b/app/views/wallaby/resources/index/_percent.html.erb @@ -0,0 +1,10 @@ +<%# @param object [model] model instance %> +<%# @param field_name [String] name of the field %> +<%# @param value [Object] value of the field %> +<%# @param metadata [Hash] metadata of the field %> +<%= if value.nil? + null +else + "%.#{ metadata[:precision] || 2 }f%%" % + (value.to_f * (metadata[:is_percent] ? 1 : 100)) +end %> diff --git a/app/views/wallaby/resources/new.html.erb b/app/views/wallaby/resources/new.html.erb index ca3e4e4a..d26e5834 100644 --- a/app/views/wallaby/resources/new.html.erb +++ b/app/views/wallaby/resources/new.html.erb @@ -1,19 +1 @@ -<% decorated = decorate resource %> -
-
-

<%= wt 'labels.create', model: to_model_label(current_model_class) %>

- <%= render 'resource_navs' %> -
- <%= render 'flash_messages' %> -
-
- <%= form_for( - decorated, - url: url_for(action: :index), method: :post, - html: { :multipart => true } - ) do |form| %> - <%= render 'form', form: form, decorated: decorated %> - <% end %> -
-
-
+<%= render 'new_page' %> diff --git a/app/views/wallaby/resources/show.html.erb b/app/views/wallaby/resources/show.html.erb index f1765568..d6120a49 100644 --- a/app/views/wallaby/resources/show.html.erb +++ b/app/views/wallaby/resources/show.html.erb @@ -1,42 +1 @@ -
- <% - if resource - # decorate first on every page or partial - decorated = decorate resource - %> -
-

<%= show_title decorated %>

- <%= render 'resource_navs' %> -
- <%= render 'flash_messages' %> -
-
- <% decorated.show_field_names.each do |field_name| %> -
-
<%= decorated.show_label_of field_name %>
-
- <%= render decorated.show_type_of(field_name), - object: decorated, - field_name: field_name, - value: decorated.try(field_name), - metadata: decorated.show_metadata_of(field_name) - %> -
-
- <% end %> -
-
- <% else %> -
-

<%= to_model_label(current_model_class) %>

- <%= render 'resource_navs' %> -
- <%= render 'flash_messages' %> -
-
- <%= image_tag 'wallaby/not_found.png' %> - <%= wt 'errors.not_found.resource', resource: to_model_label(current_model_class) %> -
-
- <% end %> -
+<%= render 'show_page' %> diff --git a/spec/dummy/app/controllers/admin/categories_controller.rb b/spec/dummy/app/controllers/admin/categories_controller.rb index 18cdc09c..3490e77f 100644 --- a/spec/dummy/app/controllers/admin/categories_controller.rb +++ b/spec/dummy/app/controllers/admin/categories_controller.rb @@ -1,5 +1,11 @@ module Admin class CategoriesController < Wallaby::ResourcesController + add_mapping_actions(member_edit: 'form', collection_list: 'index') + + def collection_list + index!(template: :index, prefixes: wallaby_prefixes) + end + def member_edit flash.now[:notice] = "member_edit for #{self.class.name}" edit! diff --git a/spec/dummy/app/decorators/admin/product_decorator.rb b/spec/dummy/app/decorators/admin/product_decorator.rb new file mode 100644 index 00000000..dc0b6ddb --- /dev/null +++ b/spec/dummy/app/decorators/admin/product_decorator.rb @@ -0,0 +1,5 @@ +class Admin::ProductDecorator < Wallaby::ResourceDecorator + filters[:featured] = { + scope: -> { where(featured: true) } + } +end diff --git a/spec/dummy/app/decorators/all_postgres_type_decorator.rb b/spec/dummy/app/decorators/all_postgres_type_decorator.rb index ca7e86bd..c6ab0a66 100644 --- a/spec/dummy/app/decorators/all_postgres_type_decorator.rb +++ b/spec/dummy/app/decorators/all_postgres_type_decorator.rb @@ -1,7 +1,7 @@ class AllPostgresTypeDecorator < Wallaby::ResourceDecorator - # self.fields[:color][:type] = 'color' - # self.fields[:email][:type] = 'email' - # self.fields[:password][:type] = 'password' + self.fields[:color][:type] = 'color' + self.fields[:email][:type] = 'email' + self.fields[:password][:type] = 'password' self.filters[:true] = { scope: -> { where(boolean: true) } diff --git a/spec/dummy/app/models/person.rb b/spec/dummy/app/models/person.rb index 2f2e286c..86c49d3b 100644 --- a/spec/dummy/app/models/person.rb +++ b/spec/dummy/app/models/person.rb @@ -1,2 +1,3 @@ class Person < ActiveRecord::Base + has_one :picture, as: :imageable end diff --git a/spec/dummy/app/views/admin/categories/member_edit.html.erb b/spec/dummy/app/views/admin/categories/member_edit.html.erb index 8076d507..91dcfaa2 100644 --- a/spec/dummy/app/views/admin/categories/member_edit.html.erb +++ b/spec/dummy/app/views/admin/categories/member_edit.html.erb @@ -1 +1,20 @@ -<%= render 'edit', form_url: url_for(action: :member_update) %> +<% +# decorate first on every page or partial +decorated = decorate resource +%> +
+
+

<%= wt 'labels.edit', id: decorated.id %>

+ <%= render 'resource_navs' %> +
+ <%= render 'flash_messages' %> +
+
+ <%= form_for decorated, + url: url_for(action: :member_update), method: :put, + html: { :multipart => true } do |form| %> + <%= render 'form', form: form, decorated: decorated %> + <% end %> +
+
+
diff --git a/spec/dummy/config/database.yml b/spec/dummy/config/database.yml index b8e5237b..ae140190 100644 --- a/spec/dummy/config/database.yml +++ b/spec/dummy/config/database.yml @@ -34,12 +34,12 @@ mysql: &mysql adapter: mysql2 username: root password: <%= ENV['MYSQL_ROOT_PASSWORD'] %> - database: <%= Rails.root.basename.to_s %>_<%= Rails.env %> + database: wallaby_<%= Rails.root.basename.to_s %>_<%= Rails.env %> postgresql: &postgresql host: 127.0.0.1 adapter: postgresql - database: <%= Rails.root.basename.to_s %>_<%= Rails.env %> + database: wallaby_<%= Rails.root.basename.to_s %>_<%= Rails.env %> username: <%= ENV['POSTGRES_USER'] %> password: <%= ENV['POSTGRES_PASSWORD'] %> min_messages: ERROR diff --git a/spec/dummy/config/routes.rb b/spec/dummy/config/routes.rb index 3693ee23..8a69bf9f 100644 --- a/spec/dummy/config/routes.rb +++ b/spec/dummy/config/routes.rb @@ -10,9 +10,10 @@ mount Wallaby::Engine, at: '/admin_else', as: :manager_engine mount Wallaby::Engine, at: '/before_engine', as: :before_engine wallaby_mount at: '/admin' do - resources :categories, module: :admin do - get :member_edit - put :member_update + resources :categories do + get :member_edit, on: :member + put :member_update, on: :member + get :collection_list, on: :collection end end mount Wallaby::Engine, at: '/after_engine', as: :after_engine diff --git a/spec/dummy/db/schema.rb b/spec/dummy/db/schema.rb index f4018a79..71093fc3 100644 --- a/spec/dummy/db/schema.rb +++ b/spec/dummy/db/schema.rb @@ -118,6 +118,7 @@ create_table "people", force: :cascade do |t| t.string "type" + t.integer "picture_id" end create_table "pictures", force: :cascade do |t| @@ -138,6 +139,7 @@ create_table "products", force: :cascade do |t| t.integer "category_id" + t.integer "picture_id" t.string "sku" t.string "name" t.text "description" diff --git a/spec/dummy/db/seeds.rb b/spec/dummy/db/seeds.rb index 06766103..c8c4b5cb 100644 --- a/spec/dummy/db/seeds.rb +++ b/spec/dummy/db/seeds.rb @@ -96,7 +96,7 @@ picture = Picture.new picture.name = FFaker::Name.name picture.imageable = [Product, Category].sample.all.sample - picture.file.attach(io: open('https://picsum.photos/100'), filename: "#{FFaker::Name.name}.jpg") + picture.file.attach(io: URI.open('https://picsum.photos/100'), filename: "#{FFaker::Name.name}.jpg") picture.save end @@ -106,7 +106,7 @@ blog.subject = FFaker::Lorem.sentence blog.summary = FFaker::Lorem.paragraph blog.body = FFaker::Lorem.paragraph(rand 100) - blog.image.attach(io: open('https://picsum.photos/100'), filename: "#{FFaker::Name.name}.jpg") + blog.image.attach(io: URI.open('https://picsum.photos/100'), filename: "#{FFaker::Name.name}.jpg") blog.published_at = Time.zone.now - rand(100).days blog.save end