katalyst-navigation 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/controllers/navigation/editor/menu_controller.js +4 -1
- data/app/assets/javascripts/utils/navigation/editor/menu.js +1 -1
- data/app/assets/javascripts/utils/navigation/editor/rules-engine.js +49 -12
- data/app/assets/stylesheets/katalyst/navigation/editor/_index.scss +1 -1
- data/app/assets/stylesheets/katalyst/navigation/editor/_item-rules.scss +0 -5
- data/app/controllers/concerns/katalyst/navigation/has_navigation.rb +95 -0
- data/app/controllers/katalyst/navigation/menus_controller.rb +3 -8
- data/app/helpers/katalyst/navigation/editor/item.rb +1 -1
- data/app/helpers/katalyst/navigation/editor/list.rb +1 -1
- data/app/helpers/katalyst/navigation/editor/menu.rb +4 -0
- data/app/helpers/katalyst/navigation/editor/new_item.rb +2 -2
- data/app/helpers/katalyst/navigation/editor/status_bar.rb +2 -2
- data/app/helpers/katalyst/navigation/frontend/builder.rb +5 -5
- data/app/helpers/katalyst/navigation/frontend_helper.rb +15 -5
- data/app/models/katalyst/navigation/menu.rb +1 -0
- data/app/views/katalyst/navigation/menus/_item.html.erb +1 -1
- data/app/views/katalyst/navigation/menus/edit.html.erb +13 -3
- data/app/views/katalyst/navigation/menus/index.html.erb +0 -3
- data/app/views/katalyst/navigation/menus/new.html.erb +7 -2
- data/db/migrate/20220908044500_add_depth_limit_to_menus.rb +7 -0
- data/lib/katalyst/navigation/version.rb +1 -1
- metadata +4 -6
- data/CHANGELOG.md +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94cc7f739764b2d65865d91d0d6f1431671bee909e285b51238f4343dd15883e
|
4
|
+
data.tar.gz: 51a2493050682848606784167c351865776daa9cc403e59e096e269b55afc208
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51127826086e93bdc9d6796f8eab5096c0d4a1d6af14a0623f3387a6c567263b6f28351507f5bcb683cce7f88f0a5832ac7583e2a28d59b31463eeeba8b09710
|
7
|
+
data.tar.gz: 1b7b2e4b291da7ae044b6c5de3c5df0a0d56b5ba111d7fbf454648916baf2a8634cfbc2c94216a3f327ad5ffba51440b00ca5d052bcf0d55b070b345de2a72ea
|
@@ -6,6 +6,9 @@ import RulesEngine from "utils/navigation/editor/rules-engine";
|
|
6
6
|
|
7
7
|
export default class MenuController extends Controller {
|
8
8
|
static targets = ["menu"];
|
9
|
+
static values = {
|
10
|
+
maxDepth: Number,
|
11
|
+
};
|
9
12
|
|
10
13
|
connect() {
|
11
14
|
this.state = this.menu.state;
|
@@ -85,7 +88,7 @@ export default class MenuController extends Controller {
|
|
85
88
|
if (!this.updateRequested) return;
|
86
89
|
|
87
90
|
this.updateRequested = false;
|
88
|
-
const engine = new RulesEngine();
|
91
|
+
const engine = new RulesEngine(this.maxDepthValue);
|
89
92
|
this.menu.items.forEach((item) => engine.update(item));
|
90
93
|
|
91
94
|
this.#notifyChange();
|
@@ -7,9 +7,12 @@ export default class RulesEngine {
|
|
7
7
|
"denyRemove",
|
8
8
|
"denyDrag",
|
9
9
|
"denyEdit",
|
10
|
-
"invalidDepth",
|
11
10
|
];
|
12
11
|
|
12
|
+
constructor(maxDepth = null) {
|
13
|
+
this.maxDepth = maxDepth;
|
14
|
+
}
|
15
|
+
|
13
16
|
/**
|
14
17
|
* Apply rules to the given item by computing a ruleset then merging it
|
15
18
|
* with the item's current state.
|
@@ -19,16 +22,21 @@ export default class RulesEngine {
|
|
19
22
|
update(item) {
|
20
23
|
this.rules = {};
|
21
24
|
|
25
|
+
// structural rules enforce a valid tree structure
|
22
26
|
this.firstItemDepthZero(item);
|
23
27
|
this.depthMustBeSet(item);
|
28
|
+
this.itemCannotHaveInvalidDepth(item);
|
29
|
+
this.itemCannotExceedDepthLimit(item);
|
30
|
+
|
31
|
+
// behavioural rules define what the user is allowed to do
|
24
32
|
this.parentsCannotDeNest(item);
|
25
33
|
this.rootsCannotDeNest(item);
|
26
34
|
this.nestingNeedsParent(item);
|
35
|
+
this.nestingCannotExceedMaxDepth(item);
|
27
36
|
this.leavesCannotCollapse(item);
|
28
37
|
this.needHiddenItemsToExpand(item);
|
29
38
|
this.parentsCannotBeDeleted(item);
|
30
39
|
this.parentsCannotBeDragged(item);
|
31
|
-
this.itemCannotHaveInvalidDepth(item);
|
32
40
|
|
33
41
|
RulesEngine.rules.forEach((rule) => {
|
34
42
|
item.toggleRule(rule, !!this.rules[rule]);
|
@@ -55,6 +63,34 @@ export default class RulesEngine {
|
|
55
63
|
}
|
56
64
|
}
|
57
65
|
|
66
|
+
/**
|
67
|
+
* Depth must increase stepwise.
|
68
|
+
*
|
69
|
+
* @param {Item} item
|
70
|
+
*/
|
71
|
+
itemCannotHaveInvalidDepth(item) {
|
72
|
+
const previous = item.previousItem;
|
73
|
+
if (previous && previous.depth < item.depth - 1) {
|
74
|
+
item.depth = previous.depth + 1;
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
/**
|
79
|
+
* Depth must not exceed menu's depth limit.
|
80
|
+
*
|
81
|
+
* @param {Item} item
|
82
|
+
*/
|
83
|
+
itemCannotExceedDepthLimit(item) {
|
84
|
+
if (this.maxDepth > 0 && this.maxDepth <= item.depth) {
|
85
|
+
// Note: this change can cause an issue where the previous item is treated
|
86
|
+
// like a parent even though it no longer has children. This is because
|
87
|
+
// items are processed in order. This issue does not seem worth solving
|
88
|
+
// as it only occurs if the max depth is altered. The issue can be worked
|
89
|
+
// around by saving the menu.
|
90
|
+
item.depth = this.maxDepth - 1;
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
58
94
|
/**
|
59
95
|
* De-nesting an item would create a gap of 2 between itself and its children
|
60
96
|
*
|
@@ -102,31 +138,32 @@ export default class RulesEngine {
|
|
102
138
|
}
|
103
139
|
|
104
140
|
/**
|
105
|
-
* An item can't be
|
141
|
+
* An item can't be nested (indented) if doing so would exceed the max depth.
|
106
142
|
*
|
107
143
|
* @param {Item} item
|
108
144
|
*/
|
109
|
-
|
110
|
-
if (item.
|
145
|
+
nestingCannotExceedMaxDepth(item) {
|
146
|
+
if (this.maxDepth > 0 && this.maxDepth >= item.depth + 1) {
|
147
|
+
this.#deny("denyNest");
|
148
|
+
}
|
111
149
|
}
|
112
150
|
|
113
151
|
/**
|
114
|
-
*
|
152
|
+
* An item can't be deleted if it has visible children.
|
115
153
|
*
|
116
154
|
* @param {Item} item
|
117
155
|
*/
|
118
|
-
|
119
|
-
if (item.hasExpandedDescendants()) this.#deny("
|
156
|
+
parentsCannotBeDeleted(item) {
|
157
|
+
if (item.hasExpandedDescendants()) this.#deny("denyRemove");
|
120
158
|
}
|
121
159
|
|
122
160
|
/**
|
123
|
-
*
|
161
|
+
* Items cannot be dragged if they have visible children.
|
124
162
|
*
|
125
163
|
* @param {Item} item
|
126
164
|
*/
|
127
|
-
|
128
|
-
|
129
|
-
if (previous && previous.depth < item.depth - 1) this.#deny("invalidDepth");
|
165
|
+
parentsCannotBeDragged(item) {
|
166
|
+
if (item.hasExpandedDescendants()) this.#deny("denyDrag");
|
130
167
|
}
|
131
168
|
|
132
169
|
/**
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Katalyst
|
4
|
+
module Navigation
|
5
|
+
# Preloads navigation menus before content is rendered.
|
6
|
+
module HasNavigation
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
# Override the default navigation builder for all views rendered by this
|
10
|
+
# controller and any of its descendants. Accepts a subclass of
|
11
|
+
# Katalyst::Navigation::Frontend::Builder.
|
12
|
+
#
|
13
|
+
# For example, given a form builder:
|
14
|
+
#
|
15
|
+
# class AdminNavBuilder < Katalyst::Navigation::Frontend::Builder
|
16
|
+
# def render_item(item)
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# The controller specifies a form builder as its default:
|
21
|
+
#
|
22
|
+
# class AdminAreaController < ApplicationController
|
23
|
+
# default_navigation_builder AdminNavBuilder
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# Then in the view any form using +navigation_menu_with+ will be an instance of the
|
27
|
+
# specified navigation builder:
|
28
|
+
#
|
29
|
+
# <%= navigation_menu_with(menu: @menu) %>
|
30
|
+
module NavigationBuilder
|
31
|
+
extend ActiveSupport::Concern
|
32
|
+
|
33
|
+
included do
|
34
|
+
class_attribute :_default_navigation_builder, instance_accessor: false
|
35
|
+
end
|
36
|
+
|
37
|
+
class_methods do
|
38
|
+
# Set the navigation builder to be used as the default for all navs
|
39
|
+
# in the views rendered by this controller and its subclasses.
|
40
|
+
#
|
41
|
+
# @param builder {Katalyst::Navigation::Frontend::Builder}
|
42
|
+
def default_navigation_builder(builder)
|
43
|
+
self._default_navigation_builder = builder
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Default navigation builder for the controller
|
48
|
+
#
|
49
|
+
# @return {Katalyst::Navigation::Frontend::Builder}
|
50
|
+
def default_navigation_builder
|
51
|
+
self.class._default_navigation_builder
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Provide an accessor for navigation menus
|
56
|
+
module NavigationHelper
|
57
|
+
# Retrieves the preloaded menu that matches the given slug.
|
58
|
+
#
|
59
|
+
# @return {Katalyst::Navigation::Menu} menu with the given slug
|
60
|
+
def navigation_menu_for(slug)
|
61
|
+
@navigation_menus[slug.to_s]
|
62
|
+
end
|
63
|
+
|
64
|
+
# @see ActionView::Helpers::ControllerHelper#assign_controller
|
65
|
+
def assign_controller(controller)
|
66
|
+
super
|
67
|
+
|
68
|
+
if controller.respond_to?(:default_navigation_builder)
|
69
|
+
@_default_navigation_builder = controller.default_navigation_builder
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
included do
|
75
|
+
include NavigationBuilder
|
76
|
+
|
77
|
+
helper Katalyst::Navigation::FrontendHelper
|
78
|
+
helper NavigationHelper
|
79
|
+
|
80
|
+
# @see ActionController::Rendering#render
|
81
|
+
def render(*args)
|
82
|
+
set_navigation_menus
|
83
|
+
|
84
|
+
super
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
protected
|
89
|
+
|
90
|
+
def set_navigation_menus
|
91
|
+
@navigation_menus = Katalyst::Navigation::Menu.includes(:published_version).index_by(&:slug)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -39,7 +39,7 @@ module Katalyst
|
|
39
39
|
def update
|
40
40
|
menu = Menu.find(params[:id])
|
41
41
|
|
42
|
-
menu.attributes =
|
42
|
+
menu.attributes = menu_params
|
43
43
|
|
44
44
|
unless menu.valid?
|
45
45
|
return render :show, locals: { menu: menu }, status: :unprocessable_entity
|
@@ -62,20 +62,15 @@ module Katalyst
|
|
62
62
|
|
63
63
|
menu.destroy!
|
64
64
|
|
65
|
-
redirect_to action: :index
|
65
|
+
redirect_to action: :index, status: :see_other
|
66
66
|
end
|
67
67
|
|
68
68
|
private
|
69
69
|
|
70
70
|
def menu_params
|
71
|
-
params.require(:menu).permit(:title, :slug)
|
72
|
-
end
|
73
|
-
|
74
|
-
def navigation_params
|
75
71
|
return {} if params[:menu].blank?
|
76
72
|
|
77
|
-
params.require(:menu)
|
78
|
-
.permit(:title, :slug, items_attributes: %i[id index depth])
|
73
|
+
params.require(:menu).permit(:title, :slug, :depth, items_attributes: %i[id index depth])
|
79
74
|
end
|
80
75
|
end
|
81
76
|
end
|
@@ -8,7 +8,7 @@ module Katalyst
|
|
8
8
|
|
9
9
|
def build(item, **options, &block)
|
10
10
|
self.item = item
|
11
|
-
|
11
|
+
tag.div **default_options(id: dom_id(item), **options) do
|
12
12
|
concat(capture { yield self }) if block
|
13
13
|
concat fields(item)
|
14
14
|
end
|
@@ -29,6 +29,10 @@ module Katalyst
|
|
29
29
|
add_option(options, :data, :controller, MENU_CONTROLLER)
|
30
30
|
add_option(options, :data, :action, ACTIONS)
|
31
31
|
|
32
|
+
depth = options.delete(:depth) || menu.depth
|
33
|
+
|
34
|
+
add_option(options, :data, :"#{MENU_CONTROLLER}-max-depth-value", depth) if depth
|
35
|
+
|
32
36
|
options
|
33
37
|
end
|
34
38
|
end
|
@@ -10,7 +10,7 @@ module Katalyst
|
|
10
10
|
|
11
11
|
def build(item, **options, &block)
|
12
12
|
capture do
|
13
|
-
concat(
|
13
|
+
concat(tag.div(**default_options(options)) do
|
14
14
|
concat capture(&block)
|
15
15
|
concat item_template(item)
|
16
16
|
end)
|
@@ -31,7 +31,7 @@ module Katalyst
|
|
31
31
|
# events when the user initiates drag so that it can be copied into the
|
32
32
|
# editor list on drop.
|
33
33
|
def item_template(item)
|
34
|
-
|
34
|
+
tag.template data: { "#{NEW_ITEM_CONTROLLER}-target" => "template" } do
|
35
35
|
navigation_editor_items(item: item)
|
36
36
|
end
|
37
37
|
end
|
@@ -9,7 +9,7 @@ module Katalyst
|
|
9
9
|
ACTIONS
|
10
10
|
|
11
11
|
def build(**options)
|
12
|
-
|
12
|
+
tag.div **default_options(**options) do
|
13
13
|
concat status(:published, last_update: l(menu.updated_at, format: :short))
|
14
14
|
concat status(:draft)
|
15
15
|
concat status(:dirty)
|
@@ -24,7 +24,7 @@ module Katalyst
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def actions
|
27
|
-
|
27
|
+
tag.menu do
|
28
28
|
concat action(:discard, class: "button button--text")
|
29
29
|
concat action(:revert, class: "button button--text") if menu.state == :draft
|
30
30
|
concat action(:save, class: "button button--secondary")
|
@@ -8,15 +8,15 @@ module Katalyst
|
|
8
8
|
|
9
9
|
delegate_missing_to :@template
|
10
10
|
|
11
|
-
def initialize(template,
|
11
|
+
def initialize(template, list: {}, item: {}, **menu_options)
|
12
12
|
self.template = template
|
13
|
-
self.menu_options =
|
13
|
+
self.menu_options = menu_options
|
14
14
|
self.list_options = list
|
15
15
|
self.item_options = item
|
16
16
|
end
|
17
17
|
|
18
18
|
def render(tree)
|
19
|
-
|
19
|
+
tag.ul **menu_options do
|
20
20
|
tree.each do |item|
|
21
21
|
concat render_item(item)
|
22
22
|
end
|
@@ -26,14 +26,14 @@ module Katalyst
|
|
26
26
|
def render_item(item)
|
27
27
|
return unless item.visible?
|
28
28
|
|
29
|
-
|
29
|
+
tag.li **item_options do
|
30
30
|
concat public_send("render_#{item.model_name.param_key}", item)
|
31
31
|
concat render_list(item.children) if item.children.any?
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
35
|
def render_list(items)
|
36
|
-
|
36
|
+
tag.ul **list_options do
|
37
37
|
items.each do |child|
|
38
38
|
concat render_item(child)
|
39
39
|
end
|
@@ -5,15 +5,19 @@ module Katalyst
|
|
5
5
|
module FrontendHelper
|
6
6
|
mattr_accessor :navigation_builder
|
7
7
|
|
8
|
+
attr_internal :default_navigation_builder
|
9
|
+
|
8
10
|
# Render a navigation menu. Caches based on the published version's id.
|
9
11
|
#
|
10
12
|
# @param(menu: Katalyst::Navigation::Menu)
|
11
13
|
# @return Structured HTML containing top level + nested navigation links
|
12
|
-
def
|
14
|
+
def navigation_menu_with(menu:, **options)
|
15
|
+
builder = navigation_builder(**options)
|
16
|
+
menu = menu.is_a?(Symbol) ? navigation_menu_for(menu) : menu
|
17
|
+
|
13
18
|
return unless menu&.published_version&.present?
|
14
19
|
|
15
20
|
cache menu.published_version do
|
16
|
-
builder = default_navigation_builder_class.new(self, menu: options, item: item, list: list)
|
17
21
|
concat builder.render(menu.published_tree)
|
18
22
|
end
|
19
23
|
end
|
@@ -22,8 +26,9 @@ module Katalyst
|
|
22
26
|
#
|
23
27
|
# @param(items: [Katalyst::Navigation::Item])
|
24
28
|
# @return Structured HTML containing top level + nested navigation links
|
25
|
-
def
|
26
|
-
builder =
|
29
|
+
def navigation_items_with(items:, **options)
|
30
|
+
builder = navigation_builder(**options)
|
31
|
+
|
27
32
|
capture do
|
28
33
|
items.each do |item|
|
29
34
|
concat builder.render_item(item)
|
@@ -33,8 +38,13 @@ module Katalyst
|
|
33
38
|
|
34
39
|
private
|
35
40
|
|
41
|
+
def navigation_builder(**options)
|
42
|
+
builder = options.delete(:builder) || default_navigation_builder_class
|
43
|
+
builder.new(self, **options)
|
44
|
+
end
|
45
|
+
|
36
46
|
def default_navigation_builder_class
|
37
|
-
builder =
|
47
|
+
builder = default_navigation_builder || Frontend::Builder
|
38
48
|
builder.respond_to?(:constantize) ? builder.constantize : builder
|
39
49
|
end
|
40
50
|
end
|
@@ -45,6 +45,7 @@ module Katalyst
|
|
45
45
|
|
46
46
|
validates :title, :slug, presence: true
|
47
47
|
validates :slug, uniqueness: true
|
48
|
+
validates :depth, numericality: { greater_than: 0, only_integer: true, allow_nil: true }
|
48
49
|
|
49
50
|
# A menu is in draft mode if it has an unpublished draft or it has no published version.
|
50
51
|
# @return the current state of the menu, either `published` or `draft`
|
@@ -1,15 +1,25 @@
|
|
1
1
|
<% content_for :title, "Edit navigation" %>
|
2
2
|
|
3
3
|
<%= form_with model: menu do |form| %>
|
4
|
-
<div class="field">
|
4
|
+
<div class="field required">
|
5
5
|
<%= form.label :title %>
|
6
6
|
<%= form.text_field :title %>
|
7
7
|
</div>
|
8
8
|
|
9
|
-
<div class="field">
|
9
|
+
<div class="field required">
|
10
10
|
<%= form.label :slug %>
|
11
11
|
<%= form.text_field :slug %>
|
12
12
|
</div>
|
13
13
|
|
14
|
-
|
14
|
+
<div class="field optional">
|
15
|
+
<%= form.label :depth %>
|
16
|
+
<%= form.text_field :depth %>
|
17
|
+
</div>
|
18
|
+
|
19
|
+
<div class="button-row">
|
20
|
+
<%= form.submit :save %>
|
21
|
+
<%= link_to "Delete", url_for(action: :show),
|
22
|
+
class: "button button-secondary",
|
23
|
+
data: { turbo_method: :delete, turbo_confirm: "Are you sure?" } %>
|
24
|
+
</div>
|
15
25
|
<% end %>
|
@@ -1,15 +1,20 @@
|
|
1
1
|
<% content_for :title, "New navigation" %>
|
2
2
|
|
3
3
|
<%= form_with model: menu do |form| %>
|
4
|
-
<div class="field">
|
4
|
+
<div class="field required">
|
5
5
|
<%= form.label :title %>
|
6
6
|
<%= form.text_field :title %>
|
7
7
|
</div>
|
8
8
|
|
9
|
-
<div class="field">
|
9
|
+
<div class="field required">
|
10
10
|
<%= form.label :slug %>
|
11
11
|
<%= form.text_field :slug %>
|
12
12
|
</div>
|
13
13
|
|
14
|
+
<div class="field optional">
|
15
|
+
<%= form.label :depth %>
|
16
|
+
<%= form.text_field :depth %>
|
17
|
+
</div>
|
18
|
+
|
14
19
|
<%= form.submit %>
|
15
20
|
<% 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.0
|
4
|
+
version: 1.1.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: 2022-09-
|
11
|
+
date: 2022-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -17,7 +17,6 @@ executables: []
|
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
-
- CHANGELOG.md
|
21
20
|
- LICENSE.txt
|
22
21
|
- README.md
|
23
22
|
- app/assets/config/katalyst-navigation.js
|
@@ -35,6 +34,7 @@ files:
|
|
35
34
|
- app/assets/stylesheets/katalyst/navigation/editor/_item-rules.scss
|
36
35
|
- app/assets/stylesheets/katalyst/navigation/editor/_new-items.scss
|
37
36
|
- app/assets/stylesheets/katalyst/navigation/editor/_status-bar.scss
|
37
|
+
- app/controllers/concerns/katalyst/navigation/has_navigation.rb
|
38
38
|
- app/controllers/katalyst/navigation/base_controller.rb
|
39
39
|
- app/controllers/katalyst/navigation/items_controller.rb
|
40
40
|
- app/controllers/katalyst/navigation/menus_controller.rb
|
@@ -73,6 +73,7 @@ files:
|
|
73
73
|
- config/routes.rb
|
74
74
|
- db/migrate/20220826034057_create_katalyst_navigation_menus.rb
|
75
75
|
- db/migrate/20220826034507_create_katalyst_navigation_items.rb
|
76
|
+
- db/migrate/20220908044500_add_depth_limit_to_menus.rb
|
76
77
|
- lib/katalyst/navigation.rb
|
77
78
|
- lib/katalyst/navigation/engine.rb
|
78
79
|
- lib/katalyst/navigation/version.rb
|
@@ -83,9 +84,6 @@ homepage: https://github.com/katalyst/navigation
|
|
83
84
|
licenses:
|
84
85
|
- MIT
|
85
86
|
metadata:
|
86
|
-
homepage_uri: https://github.com/katalyst/navigation
|
87
|
-
source_code_uri: https://github.com/katalyst/navigation
|
88
|
-
changelog_uri: https://github.com/katalyst/navigation/blob/main/CHANGELOG.md
|
89
87
|
rubygems_mfa_required: 'true'
|
90
88
|
post_install_message:
|
91
89
|
rdoc_options: []
|