katalyst-navigation 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +25 -0
  5. data/app/assets/config/katalyst-navigation.js +1 -0
  6. data/app/assets/javascripts/controllers/navigation/editor/item_controller.js +45 -0
  7. data/app/assets/javascripts/controllers/navigation/editor/list_controller.js +105 -0
  8. data/app/assets/javascripts/controllers/navigation/editor/menu_controller.js +110 -0
  9. data/app/assets/javascripts/controllers/navigation/editor/new_item_controller.js +12 -0
  10. data/app/assets/javascripts/controllers/navigation/editor/status_bar_controller.js +22 -0
  11. data/app/assets/javascripts/utils/navigation/editor/item.js +245 -0
  12. data/app/assets/javascripts/utils/navigation/editor/menu.js +54 -0
  13. data/app/assets/javascripts/utils/navigation/editor/rules-engine.js +140 -0
  14. data/app/assets/stylesheets/katalyst/navigation/editor/_icon.scss +17 -0
  15. data/app/assets/stylesheets/katalyst/navigation/editor/_index.scss +145 -0
  16. data/app/assets/stylesheets/katalyst/navigation/editor/_item-actions.scss +92 -0
  17. data/app/assets/stylesheets/katalyst/navigation/editor/_item-rules.scss +24 -0
  18. data/app/assets/stylesheets/katalyst/navigation/editor/_new-items.scss +22 -0
  19. data/app/assets/stylesheets/katalyst/navigation/editor/_status-bar.scss +87 -0
  20. data/app/controllers/katalyst/navigation/base_controller.rb +12 -0
  21. data/app/controllers/katalyst/navigation/items_controller.rb +57 -0
  22. data/app/controllers/katalyst/navigation/menus_controller.rb +82 -0
  23. data/app/helpers/katalyst/navigation/editor/base.rb +41 -0
  24. data/app/helpers/katalyst/navigation/editor/item.rb +69 -0
  25. data/app/helpers/katalyst/navigation/editor/list.rb +41 -0
  26. data/app/helpers/katalyst/navigation/editor/menu.rb +37 -0
  27. data/app/helpers/katalyst/navigation/editor/new_item.rb +53 -0
  28. data/app/helpers/katalyst/navigation/editor/status_bar.rb +57 -0
  29. data/app/helpers/katalyst/navigation/editor_helper.rb +46 -0
  30. data/app/helpers/katalyst/navigation/frontend/builder.rb +53 -0
  31. data/app/helpers/katalyst/navigation/frontend_helper.rb +42 -0
  32. data/app/models/concerns/katalyst/navigation/garbage_collection.rb +31 -0
  33. data/app/models/concerns/katalyst/navigation/has_tree.rb +63 -0
  34. data/app/models/katalyst/navigation/button.rb +15 -0
  35. data/app/models/katalyst/navigation/item.rb +21 -0
  36. data/app/models/katalyst/navigation/link.rb +10 -0
  37. data/app/models/katalyst/navigation/menu.rb +123 -0
  38. data/app/models/katalyst/navigation/node.rb +21 -0
  39. data/app/models/katalyst/navigation/types/nodes_type.rb +42 -0
  40. data/app/views/katalyst/navigation/items/_button.html.erb +28 -0
  41. data/app/views/katalyst/navigation/items/_link.html.erb +21 -0
  42. data/app/views/katalyst/navigation/items/edit.html.erb +4 -0
  43. data/app/views/katalyst/navigation/items/new.html.erb +4 -0
  44. data/app/views/katalyst/navigation/items/update.turbo_stream.erb +7 -0
  45. data/app/views/katalyst/navigation/menus/_item.html.erb +15 -0
  46. data/app/views/katalyst/navigation/menus/_list_item.html.erb +14 -0
  47. data/app/views/katalyst/navigation/menus/_new_item.html.erb +3 -0
  48. data/app/views/katalyst/navigation/menus/_new_items.html.erb +5 -0
  49. data/app/views/katalyst/navigation/menus/edit.html.erb +15 -0
  50. data/app/views/katalyst/navigation/menus/index.html.erb +17 -0
  51. data/app/views/katalyst/navigation/menus/new.html.erb +15 -0
  52. data/app/views/katalyst/navigation/menus/show.html.erb +15 -0
  53. data/config/importmap.rb +5 -0
  54. data/config/locales/en.yml +12 -0
  55. data/config/routes.rb +9 -0
  56. data/db/migrate/20220826034057_create_katalyst_navigation_menus.rb +25 -0
  57. data/db/migrate/20220826034507_create_katalyst_navigation_items.rb +17 -0
  58. data/lib/katalyst/navigation/engine.rb +36 -0
  59. data/lib/katalyst/navigation/version.rb +7 -0
  60. data/lib/katalyst/navigation.rb +9 -0
  61. data/lib/tasks/yarn.rake +18 -0
  62. data/spec/factories/katalyst/navigation/items.rb +14 -0
  63. data/spec/factories/katalyst/navigation/menus.rb +17 -0
  64. metadata +109 -0
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katalyst
4
+ module Navigation
5
+ # A menu is a list of items (links, buttons, etc) with order and depth creating a tree structure.
6
+ # Items should be copy-on-write, as menus store their structure as copy-on-write versions using item ids.
7
+ class Menu < ApplicationRecord
8
+ include GarbageCollection
9
+
10
+ before_destroy :unset_versions
11
+
12
+ belongs_to :draft_version,
13
+ autosave: true,
14
+ class_name: "Katalyst::Navigation::Menu::Version",
15
+ inverse_of: :parent,
16
+ optional: true
17
+ belongs_to :published_version,
18
+ class_name: "Katalyst::Navigation::Menu::Version",
19
+ inverse_of: :parent,
20
+ optional: true
21
+
22
+ has_many :versions,
23
+ class_name: "Katalyst::Navigation::Menu::Version",
24
+ dependent: :delete_all,
25
+ foreign_key: :parent_id,
26
+ inverse_of: :parent,
27
+ validate: true do
28
+ def active
29
+ menu = proxy_association.owner
30
+ where(id: [menu.published_version_id, menu.draft_version_id].uniq.compact)
31
+ end
32
+
33
+ def inactive
34
+ menu = proxy_association.owner
35
+ where.not(id: [menu.published_version_id, menu.draft_version_id].uniq.compact)
36
+ end
37
+ end
38
+
39
+ has_many :items,
40
+ autosave: true,
41
+ class_name: "Katalyst::Navigation::Item",
42
+ dependent: :delete_all,
43
+ inverse_of: :menu,
44
+ validate: true
45
+
46
+ validates :title, :slug, presence: true
47
+ validates :slug, uniqueness: true
48
+
49
+ # A menu is in draft mode if it has an unpublished draft or it has no published version.
50
+ # @return the current state of the menu, either `published` or `draft`
51
+ def state
52
+ if published_version_id && published_version_id == draft_version_id
53
+ :published
54
+ else
55
+ :draft
56
+ end
57
+ end
58
+
59
+ # Promotes the draft version to become the published version
60
+ def publish!
61
+ update!(published_version: draft_version)
62
+ self
63
+ end
64
+
65
+ # Reverts the draft version to the current published version
66
+ def revert!
67
+ update!(draft_version: published_version)
68
+ self
69
+ end
70
+
71
+ # Updates the current draft version with new structure. Attributes should be structural information about the
72
+ # items, e.g. `{index => {id:, depth:}` or `[{id:, depth:}]`.
73
+ #
74
+ # This method conforms to the behaviour of `accepts_nested_attributes_for` so that it can be used with rails form
75
+ # helpers.
76
+ def items_attributes=(attributes)
77
+ next_version.nodes = attributes
78
+ end
79
+
80
+ delegate :nodes, :items, :tree, to: :published_version, prefix: :published, allow_nil: true
81
+ delegate :nodes, :items, :tree, to: :draft_version, prefix: :draft, allow_nil: true
82
+
83
+ private
84
+
85
+ def unset_versions
86
+ update(draft_version: nil, published_version: nil)
87
+ end
88
+
89
+ # Returns an unsaved copy of draft version for accumulating changes.
90
+ def next_version
91
+ if draft_version.nil?
92
+ build_draft_version
93
+ elsif draft_version.persisted?
94
+ self.draft_version = draft_version.dup
95
+ else
96
+ draft_version
97
+ end
98
+ end
99
+
100
+ class Version < ApplicationRecord
101
+ include HasTree
102
+
103
+ belongs_to :parent, class_name: "Katalyst::Navigation::Menu", inverse_of: :versions
104
+
105
+ attribute :nodes, Types::NodesType.new, default: -> { [] }
106
+
107
+ def items
108
+ # support building menus in memory
109
+ # requires that items are added in order and index and depth are set
110
+ return parent.items unless parent.persisted?
111
+
112
+ items = parent.items.where(id: nodes.map(&:id)).index_by(&:id)
113
+ nodes.map do |node|
114
+ item = items[node.id]
115
+ item.index = node.index
116
+ item.depth = node.depth
117
+ item
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katalyst
4
+ module Navigation
5
+ # Data class for representing menu structure.
6
+ class Node
7
+ include ActiveModel::Model
8
+ include ActiveModel::Attributes
9
+
10
+ attribute :id, :integer
11
+ attribute :index, :integer
12
+ attribute :depth, :integer, default: 0
13
+
14
+ attr_accessor :item
15
+
16
+ def as_json
17
+ attributes.slice("id", "depth").as_json
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katalyst
4
+ module Navigation
5
+ module Types
6
+ # Data serialization/deserialization for Katalyst::Navigation::Menu::Version structural data
7
+ class NodesType < ActiveRecord::Type::Json
8
+ def serialize(value)
9
+ super(value.as_json)
10
+ end
11
+
12
+ def deserialize(value)
13
+ case value
14
+ when nil
15
+ nil
16
+ when String
17
+ deserialize(super)
18
+ when Hash
19
+ deserialize_params(value)
20
+ when Array
21
+ deserialize_array(value)
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ # Deserialize a params-style array, e.g. "0" => { ... }
28
+ def deserialize_params(value)
29
+ value.map do |index, attributes|
30
+ Node.new(index: index, **attributes)
31
+ end.select(&:id).sort_by(&:index)
32
+ end
33
+
34
+ def deserialize_array(value)
35
+ value.map.with_index do |attributes, index|
36
+ Node.new(index: index, **attributes)
37
+ end.select(&:id).sort_by(&:index)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,28 @@
1
+ <%= form_with model: item, scope: :item, url: path do |form| %>
2
+ <%= form.hidden_field :type %>
3
+
4
+ <div class="input">
5
+ <%= form.label :title %>
6
+ <%= form.text_field :title %>
7
+ </div>
8
+
9
+ <div class="input">
10
+ <%= form.label :url %>
11
+ <%= form.text_field :url %>
12
+ </div>
13
+
14
+ <div class="input">
15
+ <%= form.label :http_method %>
16
+ <%= form.select :http_method, Katalyst::Navigation::Button::HTTP_METHODS %>
17
+ </div>
18
+
19
+ <div class="input">
20
+ <%= form.check_box :visible %>
21
+ <%= form.label :visible %>
22
+ </div>
23
+
24
+ <div class="button-row">
25
+ <%= form.submit "Done" %>
26
+ <%= link_to "Discard", menu_path(item.menu), class: "button--text" %>
27
+ </div>
28
+ <% end %>
@@ -0,0 +1,21 @@
1
+ <%= form_with model: item, scope: :item, url: path do |form| %>
2
+ <%= form.hidden_field :type %>
3
+
4
+ <div class="field">
5
+ <%= form.label :title %>
6
+ <%= form.text_field :title %>
7
+ </div>
8
+
9
+ <div class="field">
10
+ <%= form.label :url %>
11
+ <%= form.text_field :url %>
12
+ </div>
13
+
14
+ <div class="field">
15
+ <%= form.label :visible %>
16
+ <%= form.check_box :visible %>
17
+ </div>
18
+
19
+ <%= form.submit "Done" %>
20
+ <%= link_to "Discard", item.menu %>
21
+ <% end %>
@@ -0,0 +1,4 @@
1
+ <%= turbo_frame_tag "navigation--editor--item-frame" do %>
2
+ <h3 class="heading-three">Edit <%= item.model_name.human.downcase %></h3>
3
+ <%= render item.model_name.param_key, item: item, path: menu_item_path(item.menu, item) %>
4
+ <% end %>
@@ -0,0 +1,4 @@
1
+ <%= turbo_frame_tag "navigation--editor--item-frame" do %>
2
+ <h3 class="heading-three">New <%= item.model_name.human.downcase %></h3>
3
+ <%= render item.model_name.param_key, item: item, path: menu_items_path(item.menu) %>
4
+ <% end %>
@@ -0,0 +1,7 @@
1
+ <%= turbo_stream.replace "navigation--editor--item-frame" do %>
2
+ <%= render "katalyst/navigation/menus/new_items", menu: item.menu %>
3
+ <% end %>
4
+
5
+ <%= turbo_stream.replace dom_id(previous) do %>
6
+ <%= render "katalyst/navigation/menus/item", item: item %>
7
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <%= navigation_editor_item item: item do |builder| %>
2
+ <div class="tree" data-invisible="<%= !item.visible? %>">
3
+ <%= builder.accordion_actions %>
4
+
5
+ <span role="img" value="<%= item.url.present? ? "link" : "title" %>" title="Hidden"></span>
6
+ <h4 class="title" title="<%= item.title %>"><%= item.title %></h4>
7
+ <span role="img" value="invisible" title="Hidden"></span>
8
+ </div>
9
+
10
+ <div class="url">
11
+ <%= link_to item.url || "", item.url || "" %>
12
+ </div>
13
+
14
+ <%= builder.item_actions %>
15
+ <% end %>
@@ -0,0 +1,14 @@
1
+ <li draggable="true"
2
+ data-navigation-item
3
+ data-navigation-item-id="<%= item.id %>"
4
+ data-navigation-index="<%= item.index %>"
5
+ data-navigation-depth="<%= item.depth %>"
6
+ data-deny-de-nest
7
+ data-deny-nest
8
+ data-deny-collapse
9
+ data-deny-expand
10
+ data-deny-remove
11
+ data-deny-drag
12
+ data-deny-edit>
13
+ <%= yield %>
14
+ </li>
@@ -0,0 +1,3 @@
1
+ <%= navigation_editor_new_item item: item, data: { item_type: item.model_name.param_key } do %>
2
+ <%= item.model_name.human %>
3
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <%= turbo_frame_tag "navigation--editor--item-frame" do %>
2
+ <div class="navigation--editor--new-items" role="listbox">
3
+ <%= render partial: "katalyst/navigation/menus/new_item", collection: navigation_editor_new_items(menu), as: :item %>
4
+ </div>
5
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <% content_for :title, "Edit navigation" %>
2
+
3
+ <%= form_with model: menu do |form| %>
4
+ <div class="field">
5
+ <%= form.label :title %>
6
+ <%= form.text_field :title %>
7
+ </div>
8
+
9
+ <div class="field">
10
+ <%= form.label :slug %>
11
+ <%= form.text_field :slug %>
12
+ </div>
13
+
14
+ <%= form.submit :save %>
15
+ <% end %>
@@ -0,0 +1,17 @@
1
+ <% content_for :title, "Navigations" %>
2
+
3
+ <nav class="index-table-actions">
4
+ <div class="item-actions">
5
+ <%= link_to "Add", [:new, :menu], class: "button button--primary" %>
6
+ </div>
7
+ </nav>
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
+ <%= row.cell :actions do |cell| %>
15
+ <%= button_to "Delete", menu, method: :delete, class: "button button--text" %>
16
+ <% end %>
17
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <% content_for :title, "New navigation" %>
2
+
3
+ <%= form_with model: menu do |form| %>
4
+ <div class="field">
5
+ <%= form.label :title %>
6
+ <%= form.text_field :title %>
7
+ </div>
8
+
9
+ <div class="field">
10
+ <%= form.label :slug %>
11
+ <%= form.text_field :slug %>
12
+ </div>
13
+
14
+ <%= form.submit %>
15
+ <% end %>
@@ -0,0 +1,15 @@
1
+ <% content_for :title, menu.title %>
2
+
3
+ <%= navigation_editor_status_bar menu: menu %>
4
+
5
+ <%= navigation_editor_menu menu: menu do |form| %>
6
+ <div role="rowheader">
7
+ <h4>Title</h4>
8
+ <h4>Url</h4>
9
+ <h4>Actions</h4>
10
+ </div>
11
+
12
+ <%= navigation_editor_list menu: menu %>
13
+ <% end %>
14
+
15
+ <%= render "katalyst/navigation/menus/new_items", menu: menu %>
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ pin_all_from Katalyst::Navigation::Engine.root.join("app/assets/javascripts"),
4
+ # preload in tests so that we don't start clicking before controllers load
5
+ preload: Rails.env.test?
@@ -0,0 +1,12 @@
1
+ en:
2
+ views:
3
+ katalyst:
4
+ navigation:
5
+ editor:
6
+ draft_html: Draft
7
+ dirty_html: Unsaved changes
8
+ discard: Discard
9
+ publish: Publish
10
+ published_html: Published <i>(last updated %{last_update})</i>
11
+ revert: Revert
12
+ save: Save
data/config/routes.rb ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ Katalyst::Navigation::Engine.routes.draw do
4
+ resources :menus do
5
+ resources :items, only: %i[new create edit update]
6
+ end
7
+
8
+ root to: redirect("menus")
9
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateKatalystNavigationMenus < ActiveRecord::Migration[7.0]
4
+ def change
5
+ create_table :katalyst_navigation_menus do |t|
6
+ t.string :title
7
+ t.string :slug, index: true
8
+
9
+ t.references :published_version
10
+ t.references :draft_version
11
+
12
+ t.timestamps
13
+ end
14
+
15
+ create_table :katalyst_navigation_menu_versions do |t|
16
+ t.references :parent, foreign_key: { to_table: :katalyst_navigation_menus }, null: false
17
+ t.json :nodes
18
+
19
+ t.timestamps
20
+ end
21
+
22
+ add_foreign_key :katalyst_navigation_menus, :katalyst_navigation_menu_versions, column: :published_version_id
23
+ add_foreign_key :katalyst_navigation_menus, :katalyst_navigation_menu_versions, column: :draft_version_id
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateKatalystNavigationItems < ActiveRecord::Migration[7.0]
4
+ def change
5
+ create_table :katalyst_navigation_items do |t|
6
+ t.belongs_to :menu, foreign_key: { to_table: :katalyst_navigation_menus }, null: false
7
+
8
+ t.string :type
9
+ t.string :title
10
+ t.string :url
11
+ t.string :http_method
12
+ t.boolean :visible, default: true
13
+
14
+ t.timestamps
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails"
4
+
5
+ module Katalyst
6
+ module Navigation
7
+ class Engine < ::Rails::Engine
8
+ isolate_namespace Katalyst::Navigation
9
+
10
+ initializer "katalyst-navigation.asset" do
11
+ config.after_initialize do |app|
12
+ if app.config.respond_to?(:assets)
13
+ app.config.assets.precompile += %w(katalyst-navigation.js)
14
+ end
15
+ end
16
+ end
17
+
18
+ initializer "katalyst-navigation.importmap", before: "importmap" do |app|
19
+ if app.config.respond_to?(:importmap)
20
+ app.config.importmap.paths << root.join("config/importmap.rb")
21
+ app.config.importmap.cache_sweepers << root.join("app/assets/javascripts")
22
+ end
23
+ end
24
+
25
+ initializer "katalyst-navigation.factories", after: "factory_bot.set_factory_paths" do
26
+ FactoryBot.definition_file_paths << Engine.root.join("spec/factories") if defined?(FactoryBot)
27
+ end
28
+
29
+ config.generators do |g|
30
+ g.test_framework :rspec
31
+ g.fixture_replacement :factory_bot
32
+ g.factory_bot dir: "spec/factories"
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katalyst
4
+ module Navigation
5
+ VERSION = "1.0.0"
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "katalyst/navigation/engine"
4
+ require "katalyst/navigation/version"
5
+
6
+ module Katalyst
7
+ module Navigation # :nodoc:
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :yarn do
4
+ desc "Install npm packages with yarn"
5
+ task install: :environment do
6
+ sh "yarn install"
7
+ end
8
+
9
+ desc "Lint JS/SCSS files using yarn (prettier)"
10
+ task lint: :install do
11
+ sh "yarn lint"
12
+ end
13
+
14
+ desc "Autoformat JS/SCSS files using yarn (prettier)"
15
+ task format: :install do
16
+ sh "yarn format"
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :katalyst_navigation_link, aliases: [:navigation_link], class: "Katalyst::Navigation::Link" do
5
+ title { Faker::Beer.hop }
6
+ url { Faker::Internet.unique.url }
7
+ end
8
+
9
+ factory :katalyst_navigation_button, aliases: [:navigation_button], class: "Katalyst::Navigation::Button" do
10
+ title { Faker::Beer.hop }
11
+ url { Faker::Internet.unique.url }
12
+ http_method { Katalyst::Navigation::Button::HTTP_METHODS.keys.sample }
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ FactoryBot.define do
4
+ factory :katalyst_navigation_menu, aliases: [:navigation_menu], class: "Katalyst::Navigation::Menu" do
5
+ title { Faker::Beer.unique.name }
6
+ slug { title.parameterize }
7
+
8
+ after(:build) do |menu, _context|
9
+ menu.items.each { |item| item.menu = menu }
10
+ end
11
+
12
+ after(:create) do |menu, _context|
13
+ menu.items_attributes = menu.items.map.with_index { |item, index| { id: item.id, index: index, depth: 0 } }
14
+ menu.publish!
15
+ end
16
+ end
17
+ end
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: katalyst-navigation
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Katalyst Interactive
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-09-05 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email:
15
+ - developers@katalyst.com.au
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - CHANGELOG.md
21
+ - LICENSE.txt
22
+ - README.md
23
+ - app/assets/config/katalyst-navigation.js
24
+ - app/assets/javascripts/controllers/navigation/editor/item_controller.js
25
+ - app/assets/javascripts/controllers/navigation/editor/list_controller.js
26
+ - app/assets/javascripts/controllers/navigation/editor/menu_controller.js
27
+ - app/assets/javascripts/controllers/navigation/editor/new_item_controller.js
28
+ - app/assets/javascripts/controllers/navigation/editor/status_bar_controller.js
29
+ - app/assets/javascripts/utils/navigation/editor/item.js
30
+ - app/assets/javascripts/utils/navigation/editor/menu.js
31
+ - app/assets/javascripts/utils/navigation/editor/rules-engine.js
32
+ - app/assets/stylesheets/katalyst/navigation/editor/_icon.scss
33
+ - app/assets/stylesheets/katalyst/navigation/editor/_index.scss
34
+ - app/assets/stylesheets/katalyst/navigation/editor/_item-actions.scss
35
+ - app/assets/stylesheets/katalyst/navigation/editor/_item-rules.scss
36
+ - app/assets/stylesheets/katalyst/navigation/editor/_new-items.scss
37
+ - app/assets/stylesheets/katalyst/navigation/editor/_status-bar.scss
38
+ - app/controllers/katalyst/navigation/base_controller.rb
39
+ - app/controllers/katalyst/navigation/items_controller.rb
40
+ - app/controllers/katalyst/navigation/menus_controller.rb
41
+ - app/helpers/katalyst/navigation/editor/base.rb
42
+ - app/helpers/katalyst/navigation/editor/item.rb
43
+ - app/helpers/katalyst/navigation/editor/list.rb
44
+ - app/helpers/katalyst/navigation/editor/menu.rb
45
+ - app/helpers/katalyst/navigation/editor/new_item.rb
46
+ - app/helpers/katalyst/navigation/editor/status_bar.rb
47
+ - app/helpers/katalyst/navigation/editor_helper.rb
48
+ - app/helpers/katalyst/navigation/frontend/builder.rb
49
+ - app/helpers/katalyst/navigation/frontend_helper.rb
50
+ - app/models/concerns/katalyst/navigation/garbage_collection.rb
51
+ - app/models/concerns/katalyst/navigation/has_tree.rb
52
+ - app/models/katalyst/navigation/button.rb
53
+ - app/models/katalyst/navigation/item.rb
54
+ - app/models/katalyst/navigation/link.rb
55
+ - app/models/katalyst/navigation/menu.rb
56
+ - app/models/katalyst/navigation/node.rb
57
+ - app/models/katalyst/navigation/types/nodes_type.rb
58
+ - app/views/katalyst/navigation/items/_button.html.erb
59
+ - app/views/katalyst/navigation/items/_link.html.erb
60
+ - app/views/katalyst/navigation/items/edit.html.erb
61
+ - app/views/katalyst/navigation/items/new.html.erb
62
+ - app/views/katalyst/navigation/items/update.turbo_stream.erb
63
+ - app/views/katalyst/navigation/menus/_item.html.erb
64
+ - app/views/katalyst/navigation/menus/_list_item.html.erb
65
+ - app/views/katalyst/navigation/menus/_new_item.html.erb
66
+ - app/views/katalyst/navigation/menus/_new_items.html.erb
67
+ - app/views/katalyst/navigation/menus/edit.html.erb
68
+ - app/views/katalyst/navigation/menus/index.html.erb
69
+ - app/views/katalyst/navigation/menus/new.html.erb
70
+ - app/views/katalyst/navigation/menus/show.html.erb
71
+ - config/importmap.rb
72
+ - config/locales/en.yml
73
+ - config/routes.rb
74
+ - db/migrate/20220826034057_create_katalyst_navigation_menus.rb
75
+ - db/migrate/20220826034507_create_katalyst_navigation_items.rb
76
+ - lib/katalyst/navigation.rb
77
+ - lib/katalyst/navigation/engine.rb
78
+ - lib/katalyst/navigation/version.rb
79
+ - lib/tasks/yarn.rake
80
+ - spec/factories/katalyst/navigation/items.rb
81
+ - spec/factories/katalyst/navigation/menus.rb
82
+ homepage: https://github.com/katalyst/navigation
83
+ licenses:
84
+ - MIT
85
+ 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
+ rubygems_mfa_required: 'true'
90
+ post_install_message:
91
+ rdoc_options: []
92
+ require_paths:
93
+ - lib
94
+ required_ruby_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: 2.7.0
99
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ requirements: []
105
+ rubygems_version: 3.3.7
106
+ signing_key:
107
+ specification_version: 4
108
+ summary: Navigation generator and editor
109
+ test_files: []