openproject-primer_view_components 0.70.4 → 0.71.0

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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -0
  3. data/app/assets/javascripts/components/primer/alpha/segmented_control.d.ts +2 -2
  4. data/app/assets/javascripts/components/primer/open_project/filterable_tree_view.d.ts +29 -0
  5. data/app/assets/javascripts/components/primer/open_project/tree_view/tree_view.d.ts +11 -1
  6. data/app/assets/javascripts/components/primer/open_project/tree_view/tree_view_sub_tree_node_element.d.ts +5 -1
  7. data/app/assets/javascripts/components/primer/primer.d.ts +1 -0
  8. data/app/assets/javascripts/primer_view_components.js +1 -1
  9. data/app/assets/javascripts/primer_view_components.js.map +1 -1
  10. data/app/assets/styles/primer_view_components.css +1 -1
  11. data/app/assets/styles/primer_view_components.css.map +1 -1
  12. data/app/components/primer/alpha/action_menu/sub_menu_item.rb +4 -0
  13. data/app/components/primer/alpha/segmented_control.d.ts +2 -2
  14. data/app/components/primer/alpha/segmented_control.js +12 -0
  15. data/app/components/primer/alpha/segmented_control.ts +16 -1
  16. data/app/components/primer/alpha/stack.css +1 -1
  17. data/app/components/primer/alpha/stack.css.json +5 -1
  18. data/app/components/primer/alpha/stack.css.map +1 -1
  19. data/app/components/primer/alpha/stack.pcss +13 -0
  20. data/app/components/primer/alpha/stack.rb +2 -1
  21. data/app/components/primer/open_project/filterable_tree_view/sub_tree.rb +39 -0
  22. data/app/components/primer/open_project/filterable_tree_view.d.ts +29 -0
  23. data/app/components/primer/open_project/filterable_tree_view.html.erb +28 -0
  24. data/app/components/primer/open_project/filterable_tree_view.js +409 -0
  25. data/app/components/primer/open_project/filterable_tree_view.rb +254 -0
  26. data/app/components/primer/open_project/filterable_tree_view.ts +492 -0
  27. data/app/components/primer/open_project/page_header.css +1 -1
  28. data/app/components/primer/open_project/page_header.css.json +1 -1
  29. data/app/components/primer/open_project/page_header.css.map +1 -1
  30. data/app/components/primer/open_project/page_header.pcss +4 -4
  31. data/app/components/primer/open_project/page_header.rb +6 -2
  32. data/app/components/primer/open_project/tree_view/node.rb +19 -3
  33. data/app/components/primer/open_project/tree_view/sub_tree_node.rb +14 -4
  34. data/app/components/primer/open_project/tree_view/tree_view.d.ts +11 -1
  35. data/app/components/primer/open_project/tree_view/tree_view.js +120 -20
  36. data/app/components/primer/open_project/tree_view/tree_view.ts +137 -18
  37. data/app/components/primer/open_project/tree_view/tree_view_sub_tree_node_element.d.ts +5 -1
  38. data/app/components/primer/open_project/tree_view/tree_view_sub_tree_node_element.js +27 -4
  39. data/app/components/primer/open_project/tree_view/tree_view_sub_tree_node_element.ts +36 -5
  40. data/app/components/primer/open_project/tree_view.css +1 -1
  41. data/app/components/primer/open_project/tree_view.css.json +9 -0
  42. data/app/components/primer/open_project/tree_view.css.map +1 -1
  43. data/app/components/primer/open_project/tree_view.html.erb +4 -0
  44. data/app/components/primer/open_project/tree_view.pcss +48 -0
  45. data/app/components/primer/open_project/tree_view.rb +6 -1
  46. data/app/components/primer/primer.d.ts +1 -0
  47. data/app/components/primer/primer.js +1 -0
  48. data/app/components/primer/primer.ts +1 -0
  49. data/app/lib/primer/forms/base_component.rb +1 -1
  50. data/app/lib/primer/forms/dsl/text_field_input.rb +2 -0
  51. data/config/locales/en.yml +20 -0
  52. data/lib/primer/view_components/version.rb +2 -2
  53. data/previews/primer/alpha/action_menu_preview/sub_menus.html.erb +1 -0
  54. data/previews/primer/open_project/filterable_tree_view_preview/_custom_select_js.html.erb +62 -0
  55. data/previews/primer/open_project/filterable_tree_view_preview/custom_checkbox_text.html.erb +26 -0
  56. data/previews/primer/open_project/filterable_tree_view_preview/custom_no_results_text.html.erb +28 -0
  57. data/previews/primer/open_project/filterable_tree_view_preview/custom_segmented_control.html.erb +31 -0
  58. data/previews/primer/open_project/filterable_tree_view_preview/default.html.erb +26 -0
  59. data/previews/primer/open_project/filterable_tree_view_preview/form_input.html.erb +32 -0
  60. data/previews/primer/open_project/filterable_tree_view_preview/playground.html.erb +26 -0
  61. data/previews/primer/open_project/filterable_tree_view_preview.rb +125 -0
  62. data/previews/primer/open_project/tree_view_preview/buttons.html.erb +4 -4
  63. data/previews/primer/open_project/tree_view_preview/default.html.erb +4 -4
  64. data/previews/primer/open_project/tree_view_preview/leaf_node_playground.html.erb +1 -1
  65. data/previews/primer/open_project/tree_view_preview/links.html.erb +4 -4
  66. data/previews/primer/open_project/tree_view_preview.rb +18 -8
  67. data/static/arguments.json +89 -3
  68. data/static/audited_at.json +2 -0
  69. data/static/classes.json +3 -0
  70. data/static/constants.json +40 -1
  71. data/static/info_arch.json +220 -3
  72. data/static/previews.json +86 -0
  73. data/static/statuses.json +2 -0
  74. metadata +18 -2
@@ -0,0 +1,26 @@
1
+ <%= render(Primer::OpenProject::FilterableTreeView.new) do |tree| %>
2
+ <% tree.with_sub_tree(label: "Students", expanded: expanded) do |hogwarts| %>
3
+ <% hogwarts.with_sub_tree(label: "Ravenclaw", expanded: expanded) do |ravenclaw| %>
4
+ <% ravenclaw.with_leaf(label: "Luna Lovegood") %>
5
+ <% end %>
6
+
7
+ <% hogwarts.with_sub_tree(label: "Slytherin", expanded: expanded) do |hufflepuff| %>
8
+ <% hufflepuff.with_leaf(label: "Draco Malfoy") %>
9
+ <% end %>
10
+
11
+ <% hogwarts.with_sub_tree(label: "Hufflepuff", expanded: expanded) do |hufflepuff| %>
12
+ <% hufflepuff.with_leaf(label: "Susan Bones") %>
13
+ <% end %>
14
+
15
+ <% hogwarts.with_sub_tree(label: "Gryffindor", expanded: expanded) do |hufflepuff| %>
16
+ <% hufflepuff.with_leaf(label: "Harry Potter") %>
17
+ <% hufflepuff.with_leaf(label: "Ronald Weasley") %>
18
+ <% hufflepuff.with_leaf(label: "Hermione Granger") %>
19
+ <% end %>
20
+ <% end %>
21
+
22
+ <% tree.with_leaf(label: "Albus Dumbledore") %>
23
+ <% tree.with_leaf(label: "Minerva McGonagall") %>
24
+ <% tree.with_leaf(label: "Severus Snape") %>
25
+ <% tree.with_leaf(label: "Rubeus Hagrid") %>
26
+ <% end %>
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module OpenProject
5
+ # @label FilterableTreeView
6
+ class FilterableTreeViewPreview < ViewComponent::Preview
7
+ # @label Playground
8
+ #
9
+ # @param expanded [Boolean] toggle
10
+ def playground(expanded: true)
11
+ render_with_template(locals: {
12
+ expanded: coerce_bool(expanded)
13
+ })
14
+ end
15
+
16
+ # @label Default
17
+ #
18
+ # @snapshot interactive
19
+ # @param expanded [Boolean] toggle
20
+ def default(expanded: true)
21
+ render_with_template(locals: {
22
+ expanded: coerce_bool(expanded)
23
+ })
24
+ end
25
+
26
+ # @label Form input
27
+ #
28
+ # @param expanded [Boolean] toggle
29
+ def form_input(expanded: true)
30
+ render_with_template(locals: {
31
+ expanded: coerce_bool(expanded)
32
+ })
33
+ end
34
+
35
+ # @label Custom segmented control
36
+ #
37
+ # @snapshot interactive
38
+ #
39
+ # ---------------------------
40
+ # ## Custom filter modes
41
+ #
42
+ # In addition to the default filter modes of `'all'` and `'selected'`, `FilterableTreeView` supports
43
+ # adding custom filter modes. Adding a filter mode will cause its label to appear in the `SegmentedControl` in the
44
+ # toolbar, and will be passed as the third argument to the filter function (see below).
45
+ #
46
+ # Here's how to add a custom filter mode in addition to the default ones:
47
+ #
48
+ # ```erb
49
+ # <%= render(Primer::OpenProject::FilterableTreeView.new) do |tree_view| %>
50
+ # <%# remove this line to prevent adding the default modes %>
51
+ # <% tree_view.with_default_filter_modes %>
52
+ # <% tree_view.with_filter_mode(name: "Custom", system_arguments)
53
+ # <% end %>
54
+ # ```
55
+ #
56
+ # ### Customizing the filter function
57
+ #
58
+ # The filter function can be customized by setting the value of the `filterFn` property to a function with the
59
+ # following signature:
60
+ #
61
+ # ```typescript
62
+ # export type FilterFn = (node: HTMLElement, query: string, filterMode?: string) => Range[] | null
63
+ # ```
64
+ #
65
+ # This function will be called once for each node in the tree every time filter controls change (i.e. when the
66
+ # filter mode or query string are altered). The function is called with the following arguments:
67
+ #
68
+ # |Argument |Description |
69
+ # |:-----------|:----------------------------------------------------------------|
70
+ # |`node` |The HTML node element, i.e. the element with `role=treeitem` set.|
71
+ # |`query` |The query string. |
72
+ # |`filterMode`|The filter mode, either `'all'` or `'selected'`. |
73
+ #
74
+ # The component expects the filter function to return specific values depending on the type of match:
75
+ #
76
+ # 1. No match - return `null`
77
+ # 2. Match but no highlights (eg. when the query string is empty) - return an empty array
78
+ # 3. Match with highlights - return a non-empty array of `Range` objects
79
+ #
80
+ # Example:
81
+ #
82
+ # ```javascript
83
+ # const filterableTreeView = document.querySelector('filterable-tree-view')
84
+ # filterableTreeView.filterFn = (node, query, filterMode) => {
85
+ # // custom filter implementation here
86
+ # }
87
+ # ```
88
+ #
89
+ def custom_segmented_control(expanded: true)
90
+ render_with_template(locals: {
91
+ expanded: coerce_bool(expanded)
92
+ })
93
+ end
94
+
95
+ # @label Custom no results text
96
+ def custom_no_results_text(expanded: true)
97
+ render_with_template(locals: {
98
+ expanded: coerce_bool(expanded)
99
+ })
100
+ end
101
+
102
+ # @label Custom checkbox text
103
+ def custom_checkbox_text(expanded: true)
104
+ render_with_template(locals: {
105
+ expanded: coerce_bool(expanded)
106
+ })
107
+ end
108
+
109
+ private
110
+
111
+ def coerce_bool(value)
112
+ case value
113
+ when true, false
114
+ value
115
+ when "true"
116
+ true
117
+ when "false"
118
+ false
119
+ else
120
+ false
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -1,10 +1,10 @@
1
1
  <div style="max-width: 400px">
2
2
  <%= render(Primer::OpenProject::TreeView.new(node_variant: :button)) do |tree_view| %>
3
- <% tree_view.with_sub_tree(label: "Secrets", expanded: expanded, onclick: "alert('Shhhh')") do |sub_tree| %>
4
- <% sub_tree.with_leaf(label: "Life and the universe", onclick: "alert(42)") %>
5
- <% sub_tree.with_leaf(label: "Secret ingredient", onclick: "alert('Love')") %>
3
+ <% tree_view.with_sub_tree(label: "Secrets", expanded: expanded, onclick: "alert('Shhhh')", disabled: disabled) do |sub_tree| %>
4
+ <% sub_tree.with_leaf(label: "Life and the universe", onclick: "alert(42)", disabled: disabled) %>
5
+ <% sub_tree.with_leaf(label: "Secret ingredient", onclick: "alert('Love')", disabled: disabled) %>
6
6
  <% end %>
7
7
 
8
- <% tree_view.with_leaf(label: "What do you give a sick bird?", onclick: "alert('Tweetment')") %>
8
+ <% tree_view.with_leaf(label: "What do you give a sick bird?", onclick: "alert('Tweetment')", disabled: disabled) %>
9
9
  <% end %>
10
10
  </div>
@@ -1,6 +1,6 @@
1
1
  <div style="max-width: 400px">
2
2
  <%= render(Primer::OpenProject::TreeView.new) do |tree_view| %>
3
- <% tree_view.with_sub_tree(label: "src", expanded: expanded, select_variant: select_variant, select_strategy: select_strategy) do |sub_tree| %>
3
+ <% tree_view.with_sub_tree(label: "src", expanded: expanded, disabled: disabled, select_variant: select_variant, select_strategy: select_strategy) do |sub_tree| %>
4
4
  <% sub_tree.with_leading_visual_icons(label: "Foobar") do |icons| %>
5
5
  <% icons.with_expanded_icon(icon: :"file-directory-open-fill", color: :accent) %>
6
6
  <% icons.with_collapsed_icon(icon: :"file-directory-fill", color: :accent) %>
@@ -8,16 +8,16 @@
8
8
 
9
9
  <% sub_tree.with_trailing_visual_icon(icon: :"diff-modified") %>
10
10
 
11
- <% sub_tree.with_leaf(label: "button.rb", select_variant: select_variant) do |item| %>
11
+ <% sub_tree.with_leaf(label: "button.rb", disabled: disabled, select_variant: select_variant) do |item| %>
12
12
  <% item.with_leading_visual_icon(icon: :file) %>
13
13
  <% end %>
14
14
 
15
- <% sub_tree.with_leaf(label: "icon_button.rb", current: true, select_variant: select_variant) do |item| %>
15
+ <% sub_tree.with_leaf(label: "icon_button.rb", disabled: disabled, current: true, select_variant: select_variant) do |item| %>
16
16
  <% item.with_leading_visual_icon(icon: :file) %>
17
17
  <% end %>
18
18
  <% end %>
19
19
 
20
- <% tree_view.with_leaf(label: "action_menu.rb", select_variant: select_variant) do |item| %>
20
+ <% tree_view.with_leaf(label: "action_menu.rb", disabled: disabled, select_variant: select_variant) do |item| %>
21
21
  <% item.with_leading_visual_icon(icon: :file) %>
22
22
  <% end %>
23
23
  <% end %>
@@ -1,5 +1,5 @@
1
1
  <%= render(Primer::OpenProject::TreeView.new) do |tree| %>
2
- <% tree.with_leaf(label: label, select_variant: select_variant) do |node| %>
2
+ <% tree.with_leaf(label: label, select_variant: select_variant, disabled: disabled) do |node| %>
3
3
  <% if leading_visual_icon && leading_visual_icon != :none %>
4
4
  <% node.with_leading_visual_icon(icon: leading_visual_icon) %>
5
5
  <% end %>
@@ -1,16 +1,16 @@
1
1
  <div style="max-width: 400px">
2
2
  <%= render(Primer::OpenProject::TreeView.new(node_variant: :anchor)) do |tree_view| %>
3
- <% tree_view.with_sub_tree(label: "Cloud Services", href: "https://en.wikipedia.org/wiki/Cloud_computing", target: "blank", expanded: expanded) do |sub_tree| %>
4
- <% sub_tree.with_leaf(label: "OpenProject", href: "https://www.openproject.org", target: "blank") do |node| %>
3
+ <% tree_view.with_sub_tree(label: "Cloud Services", href: "https://en.wikipedia.org/wiki/Cloud_computing", target: "blank", expanded: expanded, disabled: disabled) do |sub_tree| %>
4
+ <% sub_tree.with_leaf(label: "OpenProject", href: "https://www.openproject.org", target: "blank", disabled: disabled) do |node| %>
5
5
  <% node.with_trailing_visual_icon(icon: :"link-external") %>
6
6
  <% end %>
7
7
 
8
- <% sub_tree.with_leaf(label: "Hetzner", href: "https://www.hetzner.com", target: "blank") do |node| %>
8
+ <% sub_tree.with_leaf(label: "Hetzner", href: "https://www.hetzner.com", target: "blank", disabled: disabled) do |node| %>
9
9
  <% node.with_trailing_visual_icon(icon: :"link-external") %>
10
10
  <% end %>
11
11
  <% end %>
12
12
 
13
- <% tree_view.with_leaf(label: "GitHub", href: "https://github.com", target: "blank") do |node| %>
13
+ <% tree_view.with_leaf(label: "GitHub", href: "https://github.com", target: "blank", disabled: disabled) do |node| %>
14
14
  <% node.with_trailing_visual_icon(icon: :"link-external") %>
15
15
  <% end %>
16
16
  <% end %>
@@ -8,15 +8,18 @@ module Primer
8
8
  #
9
9
  # @snapshot interactive
10
10
  # @param expanded [Boolean] toggle
11
+ # @param disabled [Boolean] toggle
11
12
  # @param select_variant [Symbol] select [multiple, none]
12
- # @param select_strategy [Symbol] select [self, descendants]
13
+ # @param select_strategy [Symbol] select [self, descendants, mixed_descendants]
13
14
  def default(
14
15
  expanded: false,
16
+ disabled: false,
15
17
  select_variant: Primer::OpenProject::TreeView::Node::DEFAULT_SELECT_VARIANT,
16
18
  select_strategy: Primer::OpenProject::TreeView::SubTreeNode::DEFAULT_SELECT_STRATEGY
17
19
  )
18
20
  render_with_template(locals: {
19
21
  expanded: coerce_bool(expanded),
22
+ disabled: coerce_bool(disabled),
20
23
  select_variant: select_variant.to_sym,
21
24
  select_strategy: select_strategy.to_sym
22
25
  })
@@ -26,7 +29,7 @@ module Primer
26
29
  #
27
30
  # @param expanded [Boolean] toggle
28
31
  # @param select_variant [Symbol] select [multiple, none]
29
- # @param select_strategy [Symbol] select [self, descendants]
32
+ # @param select_strategy [Symbol] select [self, descendants, mixed_descendants]
30
33
  def playground(
31
34
  expanded: false,
32
35
  select_variant: Primer::OpenProject::TreeView::Node::DEFAULT_SELECT_VARIANT,
@@ -92,37 +95,44 @@ module Primer
92
95
  # @param leading_action_icon [Symbol] octicon
93
96
  # @param trailing_visual_icon [Symbol] octicon
94
97
  # @param select_variant [Symbol] select [multiple, none]
98
+ # @param disabled [Boolean] toggle
95
99
  def leaf_node_playground(
96
100
  label: "Leaf node",
97
101
  leading_visual_icon: nil,
98
102
  leading_action_icon: nil,
99
103
  trailing_visual_icon: nil,
100
- select_variant: Primer::OpenProject::TreeView::Node::DEFAULT_SELECT_VARIANT
104
+ select_variant: Primer::OpenProject::TreeView::Node::DEFAULT_SELECT_VARIANT,
105
+ disabled: false
101
106
  )
102
107
  render_with_template(locals: {
103
108
  label: label,
104
109
  leading_visual_icon: leading_visual_icon,
105
110
  leading_action_icon: leading_action_icon,
106
111
  trailing_visual_icon: trailing_visual_icon,
107
- select_variant: select_variant.to_sym
112
+ select_variant: select_variant.to_sym,
113
+ disabled: disabled
108
114
  })
109
115
  end
110
116
 
111
117
  # @label Links
112
118
  #
113
119
  # @param expanded [Boolean] toggle
114
- def links(expanded: false)
120
+ # @param disabled [Boolean] toggle
121
+ def links(expanded: false, disabled: false)
115
122
  render_with_template(locals: {
116
- expanded: coerce_bool(expanded)
123
+ expanded: coerce_bool(expanded),
124
+ disabled: coerce_bool(disabled)
117
125
  })
118
126
  end
119
127
 
120
128
  # @label Buttons
121
129
  #
122
130
  # @param expanded [Boolean] toggle
123
- def buttons(expanded: false)
131
+ # @param disabled [Boolean] toggle
132
+ def buttons(expanded: false, disabled: false)
124
133
  render_with_template(locals: {
125
- expanded: coerce_bool(expanded)
134
+ expanded: coerce_bool(expanded),
135
+ disabled: coerce_bool(disabled)
126
136
  })
127
137
  end
128
138
 
@@ -2671,7 +2671,7 @@
2671
2671
  "name": "wrap",
2672
2672
  "type": "Symbol",
2673
2673
  "default": "`:nowrap`",
2674
- "description": "Specify whether items are forced onto one line or can wrap onto multiple lines. One of `nil`, `:nowrap`, or `:wrap`."
2674
+ "description": "Specify whether items are forced onto one line or can wrap onto multiple lines. One of `nil`, `:nowrap`, `:reverse`, or `:wrap`."
2675
2675
  },
2676
2676
  {
2677
2677
  "name": "justify",
@@ -5526,6 +5526,74 @@
5526
5526
  "lookbook": "https://primer.style/view-components/lookbook/inspect/primer/open_project/file_tree_view/file_node/default/",
5527
5527
  "parameters": []
5528
5528
  },
5529
+ {
5530
+ "component": "OpenProject::FilterableTreeView",
5531
+ "status": "alpha",
5532
+ "a11y_reviewed": false,
5533
+ "short_name": "OpenProjectFilterableTreeView",
5534
+ "source": "https://github.com/primer/view_components/tree/main/app/components/primer/open_project/filterable_tree_view.rb",
5535
+ "lookbook": "https://primer.style/view-components/lookbook/inspect/primer/open_project/filterable_tree_view/default/",
5536
+ "parameters": [
5537
+ {
5538
+ "name": "tree_view_arguments",
5539
+ "type": "Hash",
5540
+ "default": "`{}`",
5541
+ "description": "Arguments that will be passed to the underlying [OpenProject::TreeView](/components/openprojecttreeview) component."
5542
+ },
5543
+ {
5544
+ "name": "form_arguments",
5545
+ "type": "Hash",
5546
+ "default": "`{}`",
5547
+ "description": "Form arguments that will be passed to the underlying [OpenProject::TreeView](/components/openprojecttreeview) component. These arguments allow the selections made within a `FilterableTreeView` to be submitted to the server as part of a Rails form. Pass the `builder:` and `name:` options to this hash. `builder:` should be an instance of `ActionView::Helpers::FormBuilder`, which are created by the standard Rails `#form_with` and `#form_for` helpers. The `name:` option is the desired name of the field that will be included in the params sent to the server on form submission."
5548
+ },
5549
+ {
5550
+ "name": "filter_input_arguments",
5551
+ "type": "Hash",
5552
+ "default": "`DEFAULT_FILTER_INPUT_ARGUMENTS.dup`",
5553
+ "description": "Arguments that will be passed to the [TextField](/components/alpha/textfield) component."
5554
+ },
5555
+ {
5556
+ "name": "filter_mode_control_arguments",
5557
+ "type": "Hash",
5558
+ "default": "`DEFAULT_FILTER_MODE_CONTROL_ARGUMENTS.dup`",
5559
+ "description": "Arguments that will be passed to the [SegmentedControl](/components/alpha/segmentedcontrol) component."
5560
+ },
5561
+ {
5562
+ "name": "include_sub_items_check_box_arguments",
5563
+ "type": "Hash",
5564
+ "default": "`DEFAULT_INCLUDE_SUB_ITEMS_CHECK_BOX_ARGUMENTS.dup`",
5565
+ "description": "Arguments that will be passed to the [CheckBox](/components/alpha/checkbox) component."
5566
+ },
5567
+ {
5568
+ "name": "no_results_node_arguments",
5569
+ "type": "Hash",
5570
+ "default": "`DEFAULT_NO_RESULTS_NODE_ARGUMENTS.dup`",
5571
+ "description": "Arguments that will be passed to a [OpenProject::TreeView::LeafNode](/components/openprojecttreeviewleafnode) component that appears when no items match the filter criteria."
5572
+ }
5573
+ ]
5574
+ },
5575
+ {
5576
+ "component": "OpenProject::FilterableTreeView::SubTree",
5577
+ "status": "alpha",
5578
+ "a11y_reviewed": false,
5579
+ "short_name": "OpenProjectFilterableTreeViewSubTree",
5580
+ "source": "https://github.com/primer/view_components/tree/main/app/components/primer/open_project/filterable_tree_view/sub_tree.rb",
5581
+ "lookbook": "https://primer.style/view-components/lookbook/inspect/primer/open_project/filterable_tree_view/sub_tree/default/",
5582
+ "parameters": [
5583
+ {
5584
+ "name": "node_variant",
5585
+ "type": "Symbol",
5586
+ "default": "N/A",
5587
+ "description": "The variant to use for this node. One of `:anchor`, `:button`, or `:div`."
5588
+ },
5589
+ {
5590
+ "name": "system_arguments",
5591
+ "type": "Hash",
5592
+ "default": "N/A",
5593
+ "description": "The arguments accepted by [OpenProject::TreeView::SubTreeContainer](/components/openprojecttreeviewsubtreecontainer)."
5594
+ }
5595
+ ]
5596
+ },
5529
5597
  {
5530
5598
  "component": "OpenProject::FlexLayout",
5531
5599
  "status": "open_project",
@@ -6081,6 +6149,18 @@
6081
6149
  "default": "`false`",
6082
6150
  "description": "The checked state of the node's checkbox. One of `false`, `mixed`, or `true`."
6083
6151
  },
6152
+ {
6153
+ "name": "disabled",
6154
+ "type": "Boolean",
6155
+ "default": "`false`",
6156
+ "description": "Whether or not the node can be activated. Passing `false` here will cause the node to appear visually disabled but it is still keyboard-focusable."
6157
+ },
6158
+ {
6159
+ "name": "value",
6160
+ "type": "String",
6161
+ "default": "`nil`",
6162
+ "description": "If this node is checked, this value will be sent to the server on form submission."
6163
+ },
6084
6164
  {
6085
6165
  "name": "content_arguments",
6086
6166
  "type": "Hash",
@@ -6215,6 +6295,12 @@
6215
6295
  "default": "N/A",
6216
6296
  "description": "The variant to use for this node. One of `:anchor`, `:button`, or `:div`."
6217
6297
  },
6298
+ {
6299
+ "name": "sub_tree_component_klass",
6300
+ "type": "Class",
6301
+ "default": "`SubTree`",
6302
+ "description": "The class to use for the sub-tree instead of the default [OpenProject::TreeView::SubTree](/components/openprojecttreeviewsubtree)"
6303
+ },
6218
6304
  {
6219
6305
  "name": "expanded",
6220
6306
  "type": "Boolean",
@@ -6224,8 +6310,8 @@
6224
6310
  {
6225
6311
  "name": "select_strategy",
6226
6312
  "type": "Symbol",
6227
- "default": "`:descendants`",
6228
- "description": "What should happen when this sub-tree node is checked. One of `:descendants` or `:self`."
6313
+ "default": "`:mixed_descendants`",
6314
+ "description": "What should happen when this sub-tree node is checked. One of `:descendants`, `:mixed_descendants`, or `:self`."
6229
6315
  },
6230
6316
  {
6231
6317
  "name": "system_arguments",
@@ -135,6 +135,8 @@
135
135
  "Primer::OpenProject::FileTreeView": "",
136
136
  "Primer::OpenProject::FileTreeView::DirectoryNode": "",
137
137
  "Primer::OpenProject::FileTreeView::FileNode": "",
138
+ "Primer::OpenProject::FilterableTreeView": "",
139
+ "Primer::OpenProject::FilterableTreeView::SubTree": "",
138
140
  "Primer::OpenProject::FlexLayout": "",
139
141
  "Primer::OpenProject::GridLayout": "",
140
142
  "Primer::OpenProject::GridLayout::Area": "",
data/static/classes.json CHANGED
@@ -496,6 +496,9 @@
496
496
  "PageHeader-description": [
497
497
  "Primer::OpenProject::PageHeader"
498
498
  ],
499
+ "PageHeader-description--underlined-links": [
500
+ "Primer::OpenProject::PageHeader"
501
+ ],
499
502
  "PageHeader-leadingAction": [
500
503
  "Primer::OpenProject::PageHeader"
501
504
  ],
@@ -1653,6 +1653,44 @@
1653
1653
  "Primer::OpenProject::FileTreeView::FileNode": {
1654
1654
  "GeneratedSlotMethods": "Primer::OpenProject::FileTreeView::FileNode::GeneratedSlotMethods"
1655
1655
  },
1656
+ "Primer::OpenProject::FilterableTreeView": {
1657
+ "DEFAULT_FILTER_INPUT_ARGUMENTS": {
1658
+ "name": "filter",
1659
+ "label": "Filter",
1660
+ "type": "search",
1661
+ "leading_visual": {
1662
+ "icon": "search"
1663
+ },
1664
+ "visually_hide_label": true,
1665
+ "show_clear_button": true
1666
+ },
1667
+ "DEFAULT_FILTER_MODES": {
1668
+ "all": {
1669
+ "label": "All",
1670
+ "selected": true
1671
+ },
1672
+ "selected": {
1673
+ "label": "Selected"
1674
+ }
1675
+ },
1676
+ "DEFAULT_FILTER_MODE_CONTROL_ARGUMENTS": {
1677
+ "aria": {
1678
+ "label": "Filter mode"
1679
+ }
1680
+ },
1681
+ "DEFAULT_INCLUDE_SUB_ITEMS_CHECK_BOX_ARGUMENTS": {
1682
+ "label": "Include sub-items",
1683
+ "name": "include_sub_items"
1684
+ },
1685
+ "DEFAULT_NO_RESULTS_NODE_ARGUMENTS": {
1686
+ "label": "No results"
1687
+ },
1688
+ "GeneratedSlotMethods": "Primer::OpenProject::FilterableTreeView::GeneratedSlotMethods",
1689
+ "SubTree": "Primer::OpenProject::FilterableTreeView::SubTree"
1690
+ },
1691
+ "Primer::OpenProject::FilterableTreeView::SubTree": {
1692
+ "GeneratedSlotMethods": "Primer::OpenProject::FilterableTreeView::SubTree::GeneratedSlotMethods"
1693
+ },
1656
1694
  "Primer::OpenProject::FlexLayout": {
1657
1695
  "GeneratedSlotMethods": "Primer::OpenProject::FlexLayout::GeneratedSlotMethods"
1658
1696
  },
@@ -1881,10 +1919,11 @@
1881
1919
  "GeneratedSlotMethods": "Primer::OpenProject::TreeView::SubTreeContainer::GeneratedSlotMethods"
1882
1920
  },
1883
1921
  "Primer::OpenProject::TreeView::SubTreeNode": {
1884
- "DEFAULT_SELECT_STRATEGY": "descendants",
1922
+ "DEFAULT_SELECT_STRATEGY": "mixed_descendants",
1885
1923
  "GeneratedSlotMethods": "Primer::OpenProject::TreeView::SubTreeNode::GeneratedSlotMethods",
1886
1924
  "SELECT_STRATEGIES": [
1887
1925
  "self",
1926
+ "mixed_descendants",
1888
1927
  "descendants"
1889
1928
  ]
1890
1929
  },