katalyst-navigation 1.3.0 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 368bcecb2264a1a536d2bbeb6c05f2dfa6762dcd693a215db21ef93db4da26f8
4
- data.tar.gz: 83ef6762cddd830df2acc4ef1404c8037211c4de4b3dbe5d8b5501bb4cf42fd7
3
+ metadata.gz: 7355ef157efbf9879accdafa63efa35f02815aa29be531d9e4f73289c130e433
4
+ data.tar.gz: 32cb8173a0f397d3b36491b35687b4a4848d5e7deed554742e5310d2a33b7a35
5
5
  SHA512:
6
- metadata.gz: a4e9965e0b7e49c055e405d90dd13dcb764f2b4b1b0fb62191347eb066e784dea5c1ee069b9a848fe283d87da1241fa840663d8152a92fe2b1f73607bae11b9b
7
- data.tar.gz: df13a7692f558a2eb5937a4e85d7137540d175ca6be500a743bfbd1caa53fc4fbba1be0acc27cc6bedf665009a8ff58439bc1d2fc35ae76028059ec0ea0614f4
6
+ metadata.gz: 52ec419f941ed4f1fb101206552c4bfde580a9c9afe8a50b63ca68ea2e569f6356a2feba27230bd9f7a6fec29f7c571703e7faee22007609aab393a0b21c7ba0
7
+ data.tar.gz: 0dbf4578c6b223b5fc6ab8f506cf4e45a392811ad181272352a64bdae83242367f927c7fa673349247f791b69387d08072c8f55b5609fa19d637880f2bf81c71
@@ -42,7 +42,7 @@ export default class Item {
42
42
  * @returns {number} logical nesting depth of node in menu
43
43
  */
44
44
  get depth() {
45
- return parseInt(this.node.dataset[`navigationDepth`]);
45
+ return parseInt(this.node.dataset[`navigationDepth`]) || 0;
46
46
  }
47
47
 
48
48
  get #depthInput() {
@@ -22,8 +22,7 @@
22
22
  }
23
23
  }
24
24
 
25
- [role="img"][value="link"],
26
- [role="img"][value="title"] {
25
+ [role="img"][title="Type"] {
27
26
  width: 1.5rem;
28
27
  height: 1.5rem;
29
28
  display: grid;
@@ -44,18 +43,18 @@
44
43
  line-height: 1.125rem;
45
44
  text-align: center;
46
45
  }
46
+ }
47
47
 
48
- &[value="link"] {
49
- &::before {
50
- content: "#";
51
- }
52
- }
48
+ [role="img"][value="heading"]::before {
49
+ content: "H";
50
+ }
53
51
 
54
- &[value="title"] {
55
- &::before {
56
- content: "T";
57
- }
58
- }
52
+ [role="img"][value="link"]::before {
53
+ content: "#";
54
+ }
55
+
56
+ [role="img"][value="button"]::before {
57
+ content: "#";
59
58
  }
60
59
 
61
60
  [role="img"][value="invisible"] {
@@ -28,6 +28,10 @@
28
28
  position: unset;
29
29
  }
30
30
 
31
+ &[data-item-type="heading"]:before {
32
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 64 64' xmlns='http://www.w3.org/2000/svg'%3E%3Cstyle%3Etext %7B font: 72px serif %7D%3C/style%3E%3Ctext x='7' y='56' textLength='48'%3EH%3C/text%3E%3C/svg%3E%0A");
33
+ }
34
+
31
35
  &[data-item-type="link"]:before {
32
36
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 48 48' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23clip0_67_1273)'%3E%3Cpath d='M16 22H32V26H16V22ZM40.2 24H44C44 18.48 39.52 14 34 14H26V17.8H34C37.42 17.8 40.2 20.58 40.2 24ZM7.8 24C7.8 20.58 10.58 17.8 14 17.8H22V14H14C8.48 14 4 18.48 4 24C4 29.52 8.48 34 14 34H22V30.2H14C10.58 30.2 7.8 27.42 7.8 24ZM38 24H34V30H28V34H34V40H38V34H44V30H38V24Z' /%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_67_1273'%3E%3Crect width='48' height='48' /%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E");
33
37
  }
@@ -10,6 +10,10 @@ module Katalyst
10
10
  render locals: { item: @menu.items.build(type: new_item_params) }
11
11
  end
12
12
 
13
+ def edit
14
+ render locals: { item: @item }
15
+ end
16
+
13
17
  def create
14
18
  item = @menu.items.build(item_params)
15
19
  if item.save
@@ -19,10 +23,6 @@ module Katalyst
19
23
  end
20
24
  end
21
25
 
22
- def edit
23
- render locals: { item: @item }
24
- end
25
-
26
26
  def update
27
27
  @item.attributes = item_params
28
28
 
@@ -9,10 +9,22 @@ module Katalyst
9
9
  render locals: { menus: menus, sort: sort }
10
10
  end
11
11
 
12
+ def show
13
+ menu = Menu.find(params[:id])
14
+
15
+ render locals: { menu: menu }
16
+ end
17
+
12
18
  def new
13
19
  render locals: { menu: Menu.new }
14
20
  end
15
21
 
22
+ def edit
23
+ menu = Menu.find(params[:id])
24
+
25
+ render locals: { menu: menu }
26
+ end
27
+
16
28
  def create
17
29
  @menu = Menu.new(menu_params)
18
30
 
@@ -23,18 +35,6 @@ module Katalyst
23
35
  end
24
36
  end
25
37
 
26
- def show
27
- menu = Menu.find(params[:id])
28
-
29
- render locals: { menu: menu }
30
- end
31
-
32
- def edit
33
- menu = Menu.find(params[:id])
34
-
35
- render locals: { menu: menu }
36
- end
37
-
38
38
  # PATCH /admins/navigation_menus/:slug
39
39
  def update
40
40
  menu = Menu.find(params[:id])
@@ -42,7 +42,8 @@ module Katalyst
42
42
  menu.attributes = menu_params
43
43
 
44
44
  unless menu.valid?
45
- return render :show, locals: { menu: menu }, status: :unprocessable_entity
45
+ return render turbo_stream: helpers.navigation_editor_errors(menu: menu),
46
+ status: :unprocessable_entity
46
47
  end
47
48
 
48
49
  case params[:commit]
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Katalyst
4
+ module Navigation
5
+ module Editor
6
+ class Errors < Base
7
+ def build(**options)
8
+ turbo_frame_tag dom_id(menu, :errors) do
9
+ next unless menu.errors.any?
10
+
11
+ tag.div(class: "navigation-errors", **options) do
12
+ tag.h2("Errors in navigation") +
13
+ tag.ul(class: "errors") do
14
+ menu.errors.each do |error|
15
+ concat(tag.li(error.message))
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -14,6 +14,7 @@ module Katalyst
14
14
  def build(options)
15
15
  form_with(model: menu, **default_options(id: menu_form_id, **options)) do |form|
16
16
  concat hidden_input
17
+ concat errors
17
18
  concat(capture { yield form })
18
19
  end
19
20
  end
@@ -26,6 +27,10 @@ module Katalyst
26
27
  tag.input(type: "hidden", name: "#{Item::ATTRIBUTES_SCOPE}[id]")
27
28
  end
28
29
 
30
+ def errors
31
+ Editor::Errors.new(self, menu).build
32
+ end
33
+
29
34
  def default_options(options)
30
35
  add_option(options, :data, :controller, MENU_CONTROLLER)
31
36
  add_option(options, :data, :action, ACTIONS)
@@ -25,7 +25,13 @@ module Katalyst
25
25
  Editor::List.new(self, menu).items(item)
26
26
  end
27
27
 
28
- # Gene
28
+ # Generate a turbo stream fragment that will show structural errors to the user.
29
+ def navigation_editor_errors(menu:, **options)
30
+ turbo_stream.replace(dom_id(menu, :errors),
31
+ Editor::Errors.new(self, menu).build(**options))
32
+ end
33
+
34
+ # Generate a new item template.
29
35
  def navigation_editor_new_item(item:, menu: item.menu, **options, &block)
30
36
  Editor::NewItem.new(self, menu).build(item, **options, &block)
31
37
  end
@@ -69,6 +69,11 @@ module Katalyst
69
69
  self
70
70
  end
71
71
 
72
+ # Required for testing items validation
73
+ def items_attributes
74
+ draft_version&.nodes&.as_json
75
+ end
76
+
72
77
  # Updates the current draft version with new structure. Attributes should be structural information about the
73
78
  # items, e.g. `{index => {id:, depth:}` or `[{id:, depth:}]`.
74
79
  #
@@ -105,6 +110,8 @@ module Katalyst
105
110
 
106
111
  attribute :nodes, Types::NodesType.new, default: -> { [] }
107
112
 
113
+ validate :ensure_items_exists
114
+
108
115
  def items
109
116
  # support building menus in memory
110
117
  # requires that items are added in order and index and depth are set
@@ -112,12 +119,18 @@ module Katalyst
112
119
 
113
120
  items = parent.items.where(id: nodes.map(&:id)).index_by(&:id)
114
121
  nodes.map do |node|
115
- item = items[node.id]
116
- item.index = node.index
117
- item.depth = node.depth
118
- item
122
+ items[node.id]&.tap do |item|
123
+ item.index = node.index
124
+ item.depth = node.depth
125
+ end
119
126
  end
120
127
  end
128
+
129
+ private
130
+
131
+ def ensure_items_exists
132
+ parent.errors.add(:items, :missing_item) unless items.all?(&:present?)
133
+ end
121
134
  end
122
135
  end
123
136
  end
@@ -2,7 +2,7 @@
2
2
  <div class="tree" data-invisible="<%= !item.visible? %>">
3
3
  <%= builder.accordion_actions %>
4
4
 
5
- <span role="img" value="<%= item.url.present? ? "link" : "title" %>" title="Type"></span>
5
+ <span role="img" value="<%= item.model_name.param_key %>" title="Type"></span>
6
6
  <h4 class="title" title="<%= item.title %>"><%= item.title %></h4>
7
7
  <span role="img" value="invisible" title="Hidden"></span>
8
8
  </div>
@@ -1,4 +1,8 @@
1
1
  en:
2
+ activerecord:
3
+ errors:
4
+ messages:
5
+ missing_item: Items are missing or invalid
2
6
  views:
3
7
  katalyst:
4
8
  navigation:
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Katalyst
4
4
  module Navigation
5
- VERSION = "1.3.0"
5
+ VERSION = "1.3.2"
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.0
4
+ version: 1.3.2
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-10-25 00:00:00.000000000 Z
11
+ date: 2022-11-08 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description:
14
14
  email:
@@ -39,6 +39,7 @@ files:
39
39
  - app/controllers/katalyst/navigation/items_controller.rb
40
40
  - app/controllers/katalyst/navigation/menus_controller.rb
41
41
  - app/helpers/katalyst/navigation/editor/base.rb
42
+ - app/helpers/katalyst/navigation/editor/errors.rb
42
43
  - app/helpers/katalyst/navigation/editor/item.rb
43
44
  - app/helpers/katalyst/navigation/editor/list.rb
44
45
  - app/helpers/katalyst/navigation/editor/menu.rb