From fbff52e48d4591a752d83fbebb49a3a355eef5ae Mon Sep 17 00:00:00 2001 From: Paul Duncan Date: Tue, 24 May 2016 20:42:20 -0400 Subject: add dropdown class and post type dropdown --- src/guff.cr | 105 +++++++++++++++++++++++++++++++++++++++++--- src/views/admin-page.ecr | 30 +++++++++++++ src/views/dropdown/item.ecr | 28 ++++++++++++ src/views/dropdown/menu.ecr | 19 ++++++++ 4 files changed, 176 insertions(+), 6 deletions(-) create mode 100644 src/views/dropdown/item.ecr create mode 100644 src/views/dropdown/menu.ecr (limited to 'src') diff --git a/src/guff.cr b/src/guff.cr index b5ea71a..121f150 100644 --- a/src/guff.cr +++ b/src/guff.cr @@ -274,12 +274,14 @@ module Guff JOIN states b ON (b.state_id = a.state_id) - LEFT JOIN blogs c - ON (c.post_id = a.post_id) - LEFT JOIN pages d - ON (d.post_id = a.post_id) - LEFT JOIN projects e - ON (e.post_id = a.post_id) + JOIN sites c + ON (c.site_id = a.site_id) + LEFT JOIN blogs x + ON (x.post_id = a.post_id) + LEFT JOIN pages y + ON (y.post_id = a.post_id) + LEFT JOIN projects z + ON (z.post_id = a.post_id) WHERE %s ", @@ -485,6 +487,9 @@ module Guff "y.post_id IS NOT NULL" when "project" "z.post_id IS NOT NULL" + when "all" + # allow "all" + "1" else raise "unknown post type: #{post_type}" end @@ -1648,6 +1653,73 @@ module Guff ECR.def_to_s("src/views/tab.ecr") end + module Dropdown + module Icon + ICON_TEMPLATE = "" + + def self.icon(id : String?) + if id && id.size > 0 + ICON_TEMPLATE % [HTML.escape(id.not_nil!)] + else + "" + end + end + end + + class ItemView < View + def initialize( + context : Context, + @active : Bool, + @item : Hash(Symbol, String) + ) + super(context) + end + + private def v(id : Symbol) + h(@item[id]) + end + + private def li_css + @active ? "class='active'" : "" + end + + ECR.def_to_s("src/views/dropdown/item.ecr") + end + + class MenuView < View + def initialize( + context : Context, + @id : String, + @name : String, + @text : String, + @css : String, + @icon : String, + @default : String, + @items : Array(Hash(Symbol, String)) + ) + super(context) + + @default_name = @items.reduce("") do |r, row| + (row[:id]? == @default) ? row[:name] : r + end as String + end + + private def items + String.build do |io| + @items.each do |item| + io << ItemView.new( + context: @context, + active: @default == item[:id]?, + item: item + ).to_s + end + end + end + + ECR.def_to_s("src/views/dropdown/menu.ecr") + end + end + abstract class HTMLView < View TEMPLATES = { script: "", @@ -1677,6 +1749,27 @@ module Guff end end end + + def dropdown( + id : String, + name : String, + text : String, + icon : String, + css : String, + default : String, + items : Array(Hash(Symbol, String)) + ) + Dropdown::MenuView.new( + context: @context, + id: id, + name: name, + text: text, + icon: icon, + css: css, + default: default, + items: items + ).to_s + end end class AdminPageView < HTMLView diff --git a/src/views/admin-page.ecr b/src/views/admin-page.ecr index 39b4de3..eedc41c 100644 --- a/src/views/admin-page.ecr +++ b/src/views/admin-page.ecr @@ -84,6 +84,36 @@ new_post_button %> +
<%= + dropdown( + id: "posts-filter-type", + name: "Type", + css: "posts-filter-menu", + text: "Filter by type.", + icon: "", + default: "all", + items: [{ + id: "all", + name: "All", + text: "Show all types.", + }, { + type: "divider", + }, { + id: "blog", + name: "Blog Posts", + text: "Show blog posts.", + }, { + id: "page", + name: "Pages", + text: "Show pages.", + }, { + id: "project", + name: "Projects", + text: "Show projects.", + }], + ) + %>
+
+ +<% +when "header" +%> + +<% +else +%> +
  • > + + <%= Icon.icon(@item[:icon]?) %> + <%= v(:name) %> + +
  • +<% +end +%> diff --git a/src/views/dropdown/menu.ecr b/src/views/dropdown/menu.ecr new file mode 100644 index 0000000..ca39c1e --- /dev/null +++ b/src/views/dropdown/menu.ecr @@ -0,0 +1,19 @@ + + <%= Icon.icon(@icon) %> + <%= h(@name) %>: + <%= h(@default_name) %> + + + + -- cgit v1.2.3