katalyst-navigation 1.3.4 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c8641b8fd17205d9daa4beaf83301081e559193179c236ada502f251c577555b
4
- data.tar.gz: 3fa8331ed9c531013405915b57dd998440b385ceaf662fe72cbe74a88d29bb4f
3
+ metadata.gz: 8f0c8d0aa7dd3f14b5d2e423e9e6475a495b2ea39060c38c468834d8c415f548
4
+ data.tar.gz: f816fa5eb041622143a475d5442d0ff9cb397da26597d2ff2d691c5f28da495c
5
5
  SHA512:
6
- metadata.gz: 673b6803479f9d2b772e9bfbf0fbd05734794e334a4f9f14ace81dd83e8aca6c79554704595aa0bcbe8fdf92d5b309bffe4a5eba3c153dc6c83a5615bf6a3699
7
- data.tar.gz: 325eea3d0caab65ea72dd948adcfc6a94f847d2d2ba158d281b75281edaf6b7204608fb01e001861709592acfbd545a2b0fabf122ed50cf43e06ca98d2d71797
6
+ metadata.gz: 3bdb779e520ce91cd70fa66d33e355bb19b61bc5b011d551db70d0d1fade623ab48359a00aeb782bc26e06c0ca8a41d45c4760b4645ef0a7160ecf6b75418e75
7
+ data.tar.gz: fe696c32dd1dbb6a3e14525a3ed26b2efd99e87095dfc41585b845f7ef30704bb59725d603ec14b60b4fdf19920d7dee1ffa0bb31a5d0c9137c156075cf551f6
@@ -4,9 +4,16 @@ module Katalyst
4
4
  module Navigation
5
5
  class MenusController < BaseController
6
6
  def index
7
- sort, menus = table_sort(Menu.all)
8
-
9
- render locals: { menus: menus, sort: sort }
7
+ collection = Katalyst::Tables::Collection::Base.new(sorting: :title).with_params(params).apply(Menu.all)
8
+ table = Katalyst::Turbo::TableComponent.new(collection: collection,
9
+ id: "index-table",
10
+ class: "index-table",
11
+ caption: true)
12
+
13
+ respond_to do |format|
14
+ format.turbo_stream { render(table) } if self_referred?
15
+ format.html { render :index, locals: { table: table } }
16
+ end
10
17
  end
11
18
 
12
19
  def show
@@ -5,7 +5,7 @@ module Katalyst
5
5
  module EditorHelper
6
6
  def navigation_editor_new_items(menu)
7
7
  Katalyst::Navigation.config.items.map do |item_class|
8
- item_class = item_class.is_a?(String) ? item_class.safe_constantize : item_class
8
+ item_class = item_class.safe_constantize if item_class.is_a?(String)
9
9
  item_class.new(menu: menu)
10
10
  end
11
11
  end
@@ -9,15 +9,15 @@ module Katalyst
9
9
 
10
10
  delegate_missing_to :@template
11
11
 
12
- def initialize(template, list: {}, item: {}, **menu_options)
13
- self.template = template
14
- @menu_options = menu_options.freeze
15
- @list_options = list.freeze
16
- @item_options = item.freeze
12
+ def initialize(template, list: {}, item: {}, **menu_attributes)
13
+ self.template = template
14
+ @menu_attributes = menu_attributes.freeze
15
+ @list_attributes = list.freeze
16
+ @item_attributes = item.freeze
17
17
  end
18
18
 
19
19
  def render(tree)
20
- tag.ul(**menu_options(tree)) do
20
+ tag.ul(**menu_attributes(tree)) do
21
21
  tree.each do |item|
22
22
  concat render_item(item)
23
23
  end
@@ -27,14 +27,14 @@ module Katalyst
27
27
  def render_item(item)
28
28
  return unless item.visible?
29
29
 
30
- tag.li(**item_options(item)) do
30
+ tag.li(**item_attributes(item)) do
31
31
  concat public_send("render_#{item.model_name.param_key}", item)
32
32
  concat render_children(item) if item.children.any?
33
33
  end
34
34
  end
35
35
 
36
36
  def render_children(item)
37
- tag.ul(**list_options(item)) do
37
+ tag.ul(**list_attributes(item)) do
38
38
  item.children.each do |child|
39
39
  concat render_item(child)
40
40
  end
@@ -46,25 +46,25 @@ module Katalyst
46
46
  end
47
47
 
48
48
  def render_link(link)
49
- link_to(link.title, link.url, link.item_options)
49
+ link_to(link.title, link.url, **link.link_attributes)
50
50
  end
51
51
 
52
52
  def render_button(link)
53
- link_to(link.title, link.url, link.item_options)
53
+ link_to(link.title, link.url, **link.link_attributes)
54
54
  end
55
55
 
56
56
  private
57
57
 
58
- def menu_options(_tree)
59
- @menu_options
58
+ def menu_attributes(_tree)
59
+ @menu_attributes
60
60
  end
61
61
 
62
- def list_options(_item)
63
- @list_options
62
+ def list_attributes(_item)
63
+ @list_attributes
64
64
  end
65
65
 
66
- def item_options(_item)
67
- @item_options
66
+ def item_attributes(_item)
67
+ @item_attributes
68
68
  end
69
69
  end
70
70
  end
@@ -13,9 +13,9 @@ module Katalyst
13
13
  # @return Structured HTML containing top level + nested navigation links
14
14
  def navigation_menu_with(menu:, **options)
15
15
  builder = navigation_builder(**options)
16
- menu = menu.is_a?(Symbol) ? navigation_menu_for(menu) : menu
16
+ menu = navigation_menu_for(menu) if menu.is_a?(Symbol)
17
17
 
18
- return unless menu&.published_version&.present?
18
+ return if menu&.published_version.blank?
19
19
 
20
20
  cache menu.published_version do
21
21
  concat builder.render(menu.published_tree)
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katalyst
4
+ module Navigation
5
+ module HasLink
6
+ extend ActiveSupport::Concern
7
+
8
+ HTTP_METHODS = %w[get post patch put delete].index_by(&:itself).freeze
9
+ TARGETS = %w[self top blank kpop].index_by(&:itself).freeze
10
+
11
+ class_methods do
12
+ def permitted_params
13
+ super + %i[url http_method target]
14
+ end
15
+ end
16
+
17
+ included do
18
+ validates :url, :http_method, :target, presence: true
19
+
20
+ attribute :http_method, :string, default: "get"
21
+
22
+ enum http_method: HTTP_METHODS, _prefix: :http
23
+
24
+ attribute :target, :string, default: "self"
25
+
26
+ enum target: TARGETS, _prefix: :target
27
+ end
28
+
29
+ def link_attributes
30
+ options = if target_self?
31
+ {} # default
32
+ elsif target_blank? || target_top?
33
+ { target: "_#{target}" } # browser will handle this target
34
+ else
35
+ { data: { turbo_frame: target } } # turbo target
36
+ end
37
+
38
+ options.deep_merge!({ data: { turbo_method: http_method } }) unless http_get? || target_blank?
39
+
40
+ options
41
+ end
42
+ end
43
+ end
44
+ end
@@ -4,27 +4,9 @@ module Katalyst
4
4
  module Navigation
5
5
  # Renders an HTML button using `button_to`.
6
6
  class Button < Item
7
- HTTP_METHODS = %i[get post patch put delete].index_by(&:itself).freeze
7
+ include HasLink
8
8
 
9
- enum method: HTTP_METHODS, _prefix: :http
10
-
11
- validates :title, :url, :http_method, presence: true
12
- validates :http_method, inclusion: { in: HTTP_METHODS.values.map(&:to_s) }
13
-
14
- def self.permitted_params
15
- super + %i[http_method]
16
- end
17
-
18
- def options_for_target
19
- options = super
20
-
21
- if target == "_blank" || target == "_top" || target == "self"
22
- options.deep_merge!({ data: { method: http_method } })
23
- else
24
- options.deep_merge!({ data: { turbo_method: http_method } })
25
- end
26
- options
27
- end
9
+ validates :title, presence: true
28
10
  end
29
11
  end
30
12
  end
@@ -10,16 +10,10 @@ module Katalyst
10
10
 
11
11
  attr_accessor :parent, :children, :index, :depth
12
12
 
13
- TARGETS = %i[self _top _blank kpop].index_by(&:itself).freeze
14
-
15
- enum method: TARGETS, _prefix: :target
16
-
17
13
  def self.permitted_params
18
14
  %i[
19
15
  title
20
- url
21
16
  visible
22
- target
23
17
  type
24
18
  ]
25
19
  end
@@ -28,22 +22,6 @@ module Katalyst
28
22
  is_a? Layout
29
23
  end
30
24
 
31
- # Entrypoint for combining additional options based on attribute rules
32
- def item_options
33
- options_for_target
34
- end
35
-
36
- def options_for_target
37
- return {} if target == "self"
38
-
39
- options = { target: target }
40
-
41
- unless target == "_blank" || target == "_top"
42
- options = { data: { turbo: true, turbo_frame: target } }
43
- end
44
- options
45
- end
46
-
47
25
  private
48
26
 
49
27
  def initialize_tree
@@ -4,7 +4,9 @@ module Katalyst
4
4
  module Navigation
5
5
  # Renders an HTML link using `link_to`.
6
6
  class Link < Item
7
- validates :title, :url, presence: true
7
+ include HasLink
8
+
9
+ validates :title, presence: true
8
10
  end
9
11
  end
10
12
  end
@@ -0,0 +1,4 @@
1
+ <%= row.cell :title do |cell| %>
2
+ <%= link_to cell.value, menu %>
3
+ <% end %>
4
+ <%= row.cell :slug %>
@@ -6,9 +6,4 @@
6
6
  </div>
7
7
  </nav>
8
8
 
9
- <%= table_with collection: menus, sort: sort, class: "index-table" do |row, menu| %>
10
- <%= row.cell :title do |cell| %>
11
- <%= link_to cell.value, menu %>
12
- <% end %>
13
- <%= row.cell :slug %>
14
- <% end %>
9
+ <%= render(table) %>
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Ensures that all navigation items have a valid target and http_method.
4
+ class UpdateTargetSyntax < ActiveRecord::Migration[7.0]
5
+ def change
6
+ Katalyst::Navigation::Item.where(http_method: nil).update_all(target: "get")
7
+ Katalyst::Navigation::Item.where(target: nil).update_all(target: "self")
8
+ Katalyst::Navigation::Item.where(target: "_blank").update_all(target: "blank")
9
+ Katalyst::Navigation::Item.where(target: "_top").update_all(target: "top")
10
+ end
11
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Katalyst
4
4
  module Navigation
5
- VERSION = "1.3.4"
5
+ VERSION = "1.4.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: katalyst-navigation
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.4
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katalyst Interactive
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-15 00:00:00.000000000 Z
11
+ date: 2023-07-27 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -49,6 +49,7 @@ files:
49
49
  - app/helpers/katalyst/navigation/frontend/builder.rb
50
50
  - app/helpers/katalyst/navigation/frontend_helper.rb
51
51
  - app/models/concerns/katalyst/navigation/garbage_collection.rb
52
+ - app/models/concerns/katalyst/navigation/has_link.rb
52
53
  - app/models/concerns/katalyst/navigation/has_tree.rb
53
54
  - app/models/katalyst/navigation/button.rb
54
55
  - app/models/katalyst/navigation/heading.rb
@@ -66,6 +67,7 @@ files:
66
67
  - app/views/katalyst/navigation/items/update.turbo_stream.erb
67
68
  - app/views/katalyst/navigation/menus/_item.html.erb
68
69
  - app/views/katalyst/navigation/menus/_list_item.html.erb
70
+ - app/views/katalyst/navigation/menus/_menu.html+row.erb
69
71
  - app/views/katalyst/navigation/menus/_new_item.html.erb
70
72
  - app/views/katalyst/navigation/menus/_new_items.html.erb
71
73
  - app/views/katalyst/navigation/menus/edit.html.erb
@@ -78,6 +80,7 @@ files:
78
80
  - db/migrate/20220826034057_create_katalyst_navigation_menus.rb
79
81
  - db/migrate/20220826034507_create_katalyst_navigation_items.rb
80
82
  - db/migrate/20220908044500_add_depth_limit_to_menus.rb
83
+ - db/migrate/20230727025052_update_target_syntax.rb
81
84
  - lib/katalyst/navigation.rb
82
85
  - lib/katalyst/navigation/config.rb
83
86
  - lib/katalyst/navigation/engine.rb
@@ -104,7 +107,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
107
  - !ruby/object:Gem::Version
105
108
  version: '0'
106
109
  requirements: []
107
- rubygems_version: 3.3.7
110
+ rubygems_version: 3.4.12
108
111
  signing_key:
109
112
  specification_version: 4
110
113
  summary: Navigation generator and editor