katalyst-navigation 1.3.0 → 1.3.1

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: 368bcecb2264a1a536d2bbeb6c05f2dfa6762dcd693a215db21ef93db4da26f8
4
- data.tar.gz: 83ef6762cddd830df2acc4ef1404c8037211c4de4b3dbe5d8b5501bb4cf42fd7
3
+ metadata.gz: faf8cc382bdaae60ca2a35d93dcdfe970e36d317912ed13038607e74cf68da45
4
+ data.tar.gz: '05539e1025ee15510fb6952a3bfec19534daa834af0dd80f303081badb3a68cf'
5
5
  SHA512:
6
- metadata.gz: a4e9965e0b7e49c055e405d90dd13dcb764f2b4b1b0fb62191347eb066e784dea5c1ee069b9a848fe283d87da1241fa840663d8152a92fe2b1f73607bae11b9b
7
- data.tar.gz: df13a7692f558a2eb5937a4e85d7137540d175ca6be500a743bfbd1caa53fc4fbba1be0acc27cc6bedf665009a8ff58439bc1d2fc35ae76028059ec0ea0614f4
6
+ metadata.gz: dd9484b91afa4c6e80347513fe063989b00f838b9b6ca7bd3ff448879f444a89a7789e9e3fe7216987f67ea23fa4ae036797841b6e8631be37b157b6000b807f
7
+ data.tar.gz: 650999ce4d2ead2f82c80ec97458edbc326c0c43c57c62a5bb72f86f1c79c7c8c0adee7dba0653b4ea09b05d135677ad4de582209b13d7d9a66592ca8b49a058
@@ -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.1"
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.1
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-02 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