anchor_view_components 0.11.3 → 0.12.0

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: c4a4f71788695a998ba2ff334bdf87024cb81ba965d0a63708932a4caca25d68
4
- data.tar.gz: 19e5153cbec09a3b31ab90eab613dd0b09e9cc509aaa1faf23f0a84a0b53e259
3
+ metadata.gz: e8f0780ee72bc13ea791c529b15bbb6b4ec3318abc7054c9bea275d9e7818682
4
+ data.tar.gz: 505d4f6138f09dee2ceffdda7d68626ab85726bff41346e24e6c14597eb8198c
5
5
  SHA512:
6
- metadata.gz: 5f67ef2e00c863d8260db4644bc5d43c733cad018ef07388ae4ae8535fa97bd976bb07c3e5d72dd4c3b3044ba4fcc6460cfeb8ba5e0602145afcef59895691eb
7
- data.tar.gz: 9cbeb4d0ef16acff7592175836ea0cba5314770351bc1b15c3199b53509b0d24c015c53c468f2113580ba968e6d4e40519a69c55d4b2ad6f460ee46b17326416
6
+ metadata.gz: 7a81c2270c9c76ded2106b6184bb84d6dccc786a0ce3b6ea8dd5530f62cb120fc7eef4a1b2b4fdd87c2e8ec0bbcd42fe2822429d66ef7ab15432de2300af35be
7
+ data.tar.gz: 3125a9b7090de76a6d7d8c97f0cba7507fbc00b796472f04db59f59fd65b74775cd9eef57f4717428c8f5e26cb29aee0f746a3bb8f7eae5c8a23af8084942500
data/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.12.0 - 2023-09-11
4
+
5
+ ### Changed
6
+ - Added a record argument to the TableComponent row link lambda
7
+
8
+
9
+ ## 0.11.4 - 2023-09-07
10
+
11
+ ### Added
12
+ - PopoverComponent was extracted from ActionMenuComponent
13
+
14
+ ### Changed
15
+ - Added optional totals to TableComponent
16
+
3
17
  ## 0.11.3 - 2023-09-06
4
18
 
5
19
  ### Added
@@ -1,25 +1,17 @@
1
- <%= tag.div(
2
- class: "contents",
3
- data: { controller: "action-menu" },
4
- ) do %>
5
- <%= show_button if show_button? %>
6
- <%= tag.div(
7
- class: class_names(
8
- "absolute -left-full -top-full m-0 px-0 py-1 bg-white rounded border border-subdued popover-open:block",
9
- menu_classes
10
- ),
11
- data: { action: "toggle->action-menu#positionPopover" },
12
- id: menu_id,
13
- popover: "auto",
14
- ) do %>
15
- <ul>
16
- <% items.each do |item| %>
17
- <%= tag.li(
18
- item,
19
- class: "action-menu-item whitespace-nowrap hover:bg-grey-10",
20
- data: { testid: "action-menu-item" }
21
- ) %>
22
- <% end %>
23
- </ul>
1
+ <%= anchor_popover(id: menu_id, classes: class_names("px-0", "py-1", menu_classes)) do |popover| %>
2
+ <% if show_button? %>
3
+ <% popover.with_trigger do %>
4
+ <%= show_button %>
5
+ <% end %>
24
6
  <% end %>
7
+
8
+ <ul>
9
+ <% items.each do |item| %>
10
+ <%= tag.li(
11
+ item,
12
+ class: "action-menu-item whitespace-nowrap hover:bg-grey-10",
13
+ data: { testid: "action-menu-item" }
14
+ ) %>
15
+ <% end %>
16
+ </ul>
25
17
  <% end %>
@@ -2,8 +2,10 @@ module Anchor
2
2
  class ActionMenuComponent < Component
3
3
  renders_one :show_button, lambda { |**kwargs|
4
4
  ButtonComponent.new(
5
- data: { action_menu_target: "button", testid: "action-menu-btn" },
6
- popovertarget: @menu_id,
5
+ **popover_trigger_attributes(
6
+ popovertarget: menu_id,
7
+ data: { testid: "action-menu-btn" }
8
+ ),
7
9
  **kwargs
8
10
  )
9
11
  }
@@ -1,29 +1,29 @@
1
1
  import "@oddbird/popover-polyfill";
2
2
 
3
- import ActionMenuController from "./action_menu_controller";
4
3
  import AutocompleteController from "./autocomplete_controller";
5
4
  import DialogController from "./dialog_controller";
6
5
  import InvokerController from "./invoker_controller";
6
+ import PopoverController from "./popover_controller";
7
+ import Sortable from "stimulus-sortable";
7
8
  import ToastController from "./toast_controller";
8
9
  import ToggleController from "./toggle_controller";
9
- import Sortable from "stimulus-sortable";
10
10
  import { Application } from "@hotwired/stimulus";
11
11
 
12
12
  export function registerAnchorControllers(application: Application) {
13
- application.register("action-menu", ActionMenuController);
14
13
  application.register("autocomplete", AutocompleteController);
15
14
  application.register("dialog", DialogController);
16
15
  application.register("invoker", InvokerController);
17
- application.register("sortable", Sortable)
16
+ application.register("popover", PopoverController);
17
+ application.register("sortable", Sortable);
18
18
  application.register("toast", ToastController);
19
19
  application.register("toggle", ToggleController);
20
20
  }
21
21
 
22
22
  export {
23
- ActionMenuController,
24
23
  AutocompleteController,
25
24
  DialogController,
26
25
  InvokerController,
26
+ PopoverController,
27
27
  ToastController,
28
- ToggleController
28
+ ToggleController,
29
29
  };
@@ -0,0 +1,18 @@
1
+ <%= tag.div(
2
+ class: "contents",
3
+ data: { controller: "popover" },
4
+ ) do %>
5
+ <%= trigger if trigger? %>
6
+
7
+ <%= tag.div(
8
+ class: class_names(
9
+ "absolute -left-full -top-full m-0 bg-white rounded border border-subdued popover-open:block",
10
+ classes
11
+ ),
12
+ data: { action: "toggle->popover#positionPopover" },
13
+ id:,
14
+ popover: "auto",
15
+ ) do %>
16
+ <%= content %>
17
+ <% end %>
18
+ <% end %>
@@ -0,0 +1,5 @@
1
+ module Anchor
2
+ class PopoverComponent < Component
3
+ renders_one :trigger
4
+ end
5
+ end
@@ -10,10 +10,7 @@ export default class extends Controller<HTMLDivElement> {
10
10
  const popover = event.target;
11
11
  computePosition(this.buttonTarget, popover, {
12
12
  placement: "bottom-start",
13
- middleware: [
14
- flip(),
15
- offset(4),
16
- ]
13
+ middleware: [flip(), offset(4)],
17
14
  }).then(({ x, y }) => {
18
15
  Object.assign(popover.style, {
19
16
  left: `${x}px`,
@@ -1,2 +1,3 @@
1
1
  en:
2
2
  default_empty_message: There is no information to display
3
+ total: "Total: %{count}"
@@ -33,7 +33,7 @@
33
33
  "pl-8 py-3 pr-2 bg-[url('assets/icons/menu.svg')] bg-[length:16px_16px] bg-[8px_center] bg-no-repeat": sortable? && index.zero?,
34
34
  "px-2 py-3": !sortable? || index.positive?,
35
35
  ),
36
- data: { testid: "tr-#{model.id}-td-#{index}" },
36
+ data: { testid: "tr-#{model.id}-td-#{column.header.to_s.parameterize}" },
37
37
  ) %>
38
38
  <% end
39
39
  end
@@ -41,7 +41,11 @@
41
41
  end %>
42
42
  </table>
43
43
 
44
- <% if data.empty? %>
45
- <%= tag.p empty_message, class: "text-base text-center mt-6" %>
46
- <% end %>
44
+ <% if show_total && data.any? %>
45
+ <%= tag.div total, class: "mt-3 text-base font-semibold" %>
46
+ <% end %>
47
+
48
+ <% if data.empty? %>
49
+ <%= tag.p empty_message, class: "text-base text-center mt-6", data: { testid: "empty-table-state" } %>
50
+ <% end %>
47
51
  </div>
@@ -1,22 +1,25 @@
1
1
  module Anchor
2
2
  class TableComponent < Component
3
3
  renders_many :columns, "ColumnComponent"
4
- renders_one :link
5
4
 
6
- attr_reader :data, :sortable, :caption
5
+ attr_reader :data, :sortable, :caption, :rows_link_to, :show_total
7
6
 
8
7
  def initialize(
9
8
  data:,
10
9
  caption: nil,
11
10
  empty_message: nil,
11
+ rows_link_to: nil,
12
12
  sort_url: nil,
13
- sortable: false
13
+ sortable: false,
14
+ show_total: false
14
15
  )
15
16
  @data = data
16
17
  @empty_message = empty_message
18
+ @rows_link_to = rows_link_to
17
19
  @sortable = sortable
18
20
  @sort_url = sort_url
19
21
  @caption = caption
22
+ @show_total = show_total
20
23
 
21
24
  super
22
25
  end
@@ -29,7 +32,7 @@ module Anchor
29
32
 
30
33
  def row_classes
31
34
  row_classes = %w(border-b focus-within:bg-grey-10)
32
- if link?
35
+ if rows_link_to.present?
33
36
  row_classes += %w(hover:bg-grey-10 hover:cursor-pointer)
34
37
  end
35
38
  if sortable?
@@ -40,8 +43,8 @@ module Anchor
40
43
 
41
44
  def maybe_link(model, column, index, view_context)
42
45
  value = value_for(model, column)
43
- if link?
44
- path = "#{link}#{model.id}"
46
+ if rows_link_to.present?
47
+ path = rows_link_to.call(model)
45
48
  if index.zero?
46
49
  text = view_context.link_to(value, path)
47
50
  else
@@ -91,6 +94,10 @@ module Anchor
91
94
  columns.present?
92
95
  end
93
96
 
97
+ def total
98
+ t(".total", count: data.size)
99
+ end
100
+
94
101
  class ColumnComponent < Anchor::Component
95
102
  attr_reader :header, :value
96
103
 
@@ -11,6 +11,7 @@ module Anchor
11
11
  icon
12
12
  loading_indicator
13
13
  panel
14
+ popover
14
15
  prose
15
16
  side_nav
16
17
  tab_bar
@@ -68,5 +69,12 @@ module Anchor
68
69
 
69
70
  doc.to_html.html_safe
70
71
  end
72
+
73
+ def popover_trigger_attributes(popovertarget:, data: {})
74
+ {
75
+ data: { popover_target: "button", **data },
76
+ popovertarget:,
77
+ }
78
+ end
71
79
  end
72
80
  end
@@ -1,5 +1,5 @@
1
1
  module Anchor
2
2
  module ViewComponents
3
- VERSION = "0.11.3".freeze
3
+ VERSION = "0.12.0".freeze
4
4
  end
5
5
  end
@@ -14,8 +14,11 @@ module Anchor
14
14
  end
15
15
 
16
16
  def playground
17
- demo_table = Anchor::TableComponent.new(data:, caption: "A demo table")
18
- render demo_table do |table|
17
+ render Anchor::TableComponent.new(
18
+ data:,
19
+ caption: "A demo table",
20
+ show_total: true
21
+ ) do |table|
19
22
  table.with_column(header: "Id", value: :id)
20
23
  table.with_column(header: "Name", value: -> { _1.name.capitalize })
21
24
  end
@@ -41,7 +44,7 @@ module Anchor
41
44
  end
42
45
 
43
46
  def empty
44
- render Anchor::TableComponent.new(data: []) do |table|
47
+ render Anchor::TableComponent.new(data: [], show_total: true) do |table|
45
48
  table.with_column(header: "Id", value: :id)
46
49
  table.with_column(header: "Name", value: -> { _1.name.capitalize })
47
50
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: anchor_view_components
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.3
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Buoy Software
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-06 00:00:00.000000000 Z
11
+ date: 2023-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -62,7 +62,6 @@ files:
62
62
  - app/assets/stylesheets/components/toast.css
63
63
  - app/components/anchor/action_menu_component.html.erb
64
64
  - app/components/anchor/action_menu_component.rb
65
- - app/components/anchor/action_menu_controller.ts
66
65
  - app/components/anchor/anchor_view_components.ts
67
66
  - app/components/anchor/autocomplete_component.en.yml
68
67
  - app/components/anchor/autocomplete_component.html.erb
@@ -95,6 +94,9 @@ files:
95
94
  - app/components/anchor/panel/header_component.rb
96
95
  - app/components/anchor/panel_component.html.erb
97
96
  - app/components/anchor/panel_component.rb
97
+ - app/components/anchor/popover_component.html.erb
98
+ - app/components/anchor/popover_component.rb
99
+ - app/components/anchor/popover_controller.ts
98
100
  - app/components/anchor/prose_component.html.erb
99
101
  - app/components/anchor/prose_component.rb
100
102
  - app/components/anchor/side_nav_component.en.yml
@@ -160,7 +162,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
160
162
  - !ruby/object:Gem::Version
161
163
  version: '0'
162
164
  requirements: []
163
- rubygems_version: 3.4.18
165
+ rubygems_version: 3.4.10
164
166
  signing_key:
165
167
  specification_version: 4
166
168
  summary: ViewComponents for Buoy’s design system, Anchor