openproject-primer_view_components 0.70.5 → 0.72.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 (142) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -0
  3. data/app/assets/javascripts/components/primer/alpha/segmented_control.d.ts +2 -2
  4. data/app/assets/javascripts/components/primer/{open_project → alpha}/tree_view/tree_view.d.ts +11 -1
  5. data/app/assets/javascripts/components/primer/{open_project → alpha}/tree_view/tree_view_sub_tree_node_element.d.ts +5 -1
  6. data/app/assets/javascripts/components/primer/open_project/filterable_tree_view.d.ts +29 -0
  7. data/app/assets/javascripts/components/primer/primer.d.ts +5 -4
  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/{open_project → alpha}/file_tree_view/directory_node.rb +1 -1
  13. data/app/components/primer/{open_project → alpha}/file_tree_view/file_node.rb +1 -1
  14. data/app/components/primer/{open_project → alpha}/file_tree_view.rb +1 -1
  15. data/app/components/primer/alpha/segmented_control.d.ts +2 -2
  16. data/app/components/primer/alpha/segmented_control.js +12 -0
  17. data/app/components/primer/alpha/segmented_control.ts +16 -1
  18. data/app/components/primer/{open_project → alpha}/skeleton_box.css.json +1 -1
  19. data/app/components/primer/{open_project → alpha}/skeleton_box.css.map +1 -1
  20. data/app/components/primer/{open_project → alpha}/skeleton_box.pcss +1 -1
  21. data/app/components/primer/{open_project → alpha}/skeleton_box.rb +3 -1
  22. data/app/components/primer/alpha/stack.css +1 -1
  23. data/app/components/primer/alpha/stack.css.json +5 -1
  24. data/app/components/primer/alpha/stack.css.map +1 -1
  25. data/app/components/primer/alpha/stack.pcss +13 -0
  26. data/app/components/primer/alpha/stack.rb +2 -1
  27. data/app/components/primer/{open_project → alpha}/tree_view/icon.rb +2 -2
  28. data/app/components/primer/{open_project → alpha}/tree_view/icon_pair.rb +4 -4
  29. data/app/components/primer/{open_project → alpha}/tree_view/leading_action.rb +2 -2
  30. data/app/components/primer/{open_project → alpha}/tree_view/leaf_node.rb +6 -6
  31. data/app/components/primer/{open_project → alpha}/tree_view/loading_failure_message.rb +2 -2
  32. data/app/components/primer/{open_project → alpha}/tree_view/node.rb +30 -14
  33. data/app/components/primer/{open_project → alpha}/tree_view/skeleton_loader.html.erb +3 -3
  34. data/app/components/primer/{open_project → alpha}/tree_view/skeleton_loader.rb +4 -4
  35. data/app/components/primer/{open_project → alpha}/tree_view/spinner_loader.html.erb +2 -2
  36. data/app/components/primer/{open_project → alpha}/tree_view/spinner_loader.rb +4 -4
  37. data/app/components/primer/{open_project → alpha}/tree_view/sub_tree.html.erb +1 -1
  38. data/app/components/primer/{open_project → alpha}/tree_view/sub_tree.rb +10 -10
  39. data/app/components/primer/{open_project → alpha}/tree_view/sub_tree_container.rb +2 -2
  40. data/app/components/primer/{open_project → alpha}/tree_view/sub_tree_node.rb +28 -18
  41. data/app/components/primer/{open_project → alpha}/tree_view/tree_view.d.ts +11 -1
  42. data/app/components/primer/{open_project → alpha}/tree_view/tree_view.js +120 -20
  43. data/app/components/primer/{open_project → alpha}/tree_view/tree_view.ts +137 -18
  44. data/app/components/primer/{open_project → alpha}/tree_view/tree_view_include_fragment_element.js +0 -1
  45. data/app/components/primer/{open_project → alpha}/tree_view/tree_view_include_fragment_element.ts +0 -1
  46. data/app/components/primer/{open_project → alpha}/tree_view/tree_view_sub_tree_node_element.d.ts +5 -1
  47. data/app/components/primer/{open_project → alpha}/tree_view/tree_view_sub_tree_node_element.js +27 -4
  48. data/app/components/primer/{open_project → alpha}/tree_view/tree_view_sub_tree_node_element.ts +36 -5
  49. data/app/components/primer/{open_project → alpha}/tree_view/visual.rb +2 -2
  50. data/app/components/primer/alpha/tree_view.css +1 -0
  51. data/app/components/primer/{open_project → alpha}/tree_view.css.json +8 -1
  52. data/app/components/primer/alpha/tree_view.css.map +1 -0
  53. data/app/components/primer/alpha/tree_view.html.erb +12 -0
  54. data/app/components/primer/{open_project → alpha}/tree_view.pcss +39 -0
  55. data/app/components/primer/{open_project → alpha}/tree_view.rb +20 -12
  56. data/app/components/primer/beta/breadcrumbs.css +1 -1
  57. data/app/components/primer/beta/breadcrumbs.css.json +0 -1
  58. data/app/components/primer/beta/breadcrumbs.css.map +1 -1
  59. data/app/components/primer/beta/breadcrumbs.pcss +2 -8
  60. data/app/components/primer/beta/progress_bar.css +1 -1
  61. data/app/components/primer/beta/progress_bar.css.map +1 -1
  62. data/app/components/primer/beta/progress_bar.pcss +3 -2
  63. data/app/components/primer/beta/relative_time.rb +3 -0
  64. data/app/components/primer/open_project/filterable_tree_view/sub_tree.rb +39 -0
  65. data/app/components/primer/open_project/filterable_tree_view.d.ts +29 -0
  66. data/app/components/primer/open_project/filterable_tree_view.html.erb +28 -0
  67. data/app/components/primer/open_project/filterable_tree_view.js +409 -0
  68. data/app/components/primer/open_project/filterable_tree_view.rb +254 -0
  69. data/app/components/primer/open_project/filterable_tree_view.ts +492 -0
  70. data/app/components/primer/primer.d.ts +5 -4
  71. data/app/components/primer/primer.js +5 -4
  72. data/app/components/primer/primer.pcss +2 -2
  73. data/app/components/primer/primer.ts +5 -4
  74. data/app/controllers/primer/view_components/tree_view_items_controller.rb +1 -1
  75. data/app/forms/check_box_with_nested_form.rb +10 -10
  76. data/app/forms/radio_button_with_nested_form.rb +16 -16
  77. data/app/lib/primer/experimental_slot_helpers.rb +2 -2
  78. data/app/lib/primer/forms/base_component.rb +1 -1
  79. data/app/lib/primer/forms/dsl/text_field_input.rb +2 -0
  80. data/app/views/primer/view_components/tree_view_items/async_alpha.html_fragment.erb +1 -1
  81. data/app/views/primer/view_components/tree_view_items/index.html_fragment.erb +1 -1
  82. data/config/locales/en.yml +20 -0
  83. data/lib/primer/view_components/version.rb +2 -2
  84. data/previews/primer/{open_project → alpha}/file_tree_view_preview/default.html.erb +1 -1
  85. data/previews/primer/{open_project → alpha}/file_tree_view_preview/playground.html.erb +1 -1
  86. data/previews/primer/{open_project → alpha}/file_tree_view_preview.rb +1 -1
  87. data/previews/primer/{open_project → alpha}/skeleton_box_preview.rb +3 -3
  88. data/previews/primer/{open_project → alpha}/tree_view_preview/async_alpha.html.erb +1 -1
  89. data/previews/primer/{open_project → alpha}/tree_view_preview/buttons.html.erb +5 -5
  90. data/previews/primer/{open_project → alpha}/tree_view_preview/default.html.erb +5 -5
  91. data/previews/primer/{open_project → alpha}/tree_view_preview/empty.html.erb +1 -1
  92. data/previews/primer/alpha/tree_view_preview/form_input.html.erb +14 -0
  93. data/previews/primer/{open_project → alpha}/tree_view_preview/leaf_node_playground.html.erb +2 -2
  94. data/previews/primer/{open_project → alpha}/tree_view_preview/links.html.erb +5 -5
  95. data/previews/primer/{open_project → alpha}/tree_view_preview/loading_failure.html.erb +1 -1
  96. data/previews/primer/{open_project → alpha}/tree_view_preview/loading_skeleton.html.erb +1 -1
  97. data/previews/primer/{open_project → alpha}/tree_view_preview/loading_spinner.html.erb +1 -1
  98. data/previews/primer/{open_project → alpha}/tree_view_preview/playground.html.erb +1 -1
  99. data/previews/primer/{open_project → alpha}/tree_view_preview.rb +34 -15
  100. data/previews/primer/open_project/filterable_tree_view_preview/_custom_select_js.html.erb +62 -0
  101. data/previews/primer/open_project/filterable_tree_view_preview/custom_checkbox_text.html.erb +26 -0
  102. data/previews/primer/open_project/filterable_tree_view_preview/custom_no_results_text.html.erb +28 -0
  103. data/previews/primer/open_project/filterable_tree_view_preview/custom_segmented_control.html.erb +31 -0
  104. data/previews/primer/open_project/filterable_tree_view_preview/default.html.erb +26 -0
  105. data/previews/primer/open_project/filterable_tree_view_preview/form_input.html.erb +32 -0
  106. data/previews/primer/open_project/filterable_tree_view_preview/playground.html.erb +26 -0
  107. data/previews/primer/open_project/filterable_tree_view_preview/stress_test.html.erb +28 -0
  108. data/previews/primer/open_project/filterable_tree_view_preview.rb +125 -0
  109. data/static/arguments.json +1685 -1581
  110. data/static/audited_at.json +19 -17
  111. data/static/classes.json +5 -5
  112. data/static/constants.json +137 -98
  113. data/static/info_arch.json +6396 -6146
  114. data/static/previews.json +120 -21
  115. data/static/statuses.json +19 -17
  116. metadata +102 -84
  117. data/app/components/primer/open_project/tree_view.css +0 -1
  118. data/app/components/primer/open_project/tree_view.css.map +0 -1
  119. data/app/components/primer/open_project/tree_view.html.erb +0 -7
  120. /data/app/assets/javascripts/components/primer/{open_project → alpha}/tree_view/tree_view_icon_pair_element.d.ts +0 -0
  121. /data/app/assets/javascripts/components/primer/{open_project → alpha}/tree_view/tree_view_include_fragment_element.d.ts +0 -0
  122. /data/app/assets/javascripts/components/primer/{open_project → alpha}/tree_view/tree_view_roving_tab_index.d.ts +0 -0
  123. /data/app/components/primer/{open_project → alpha}/file_tree_view/directory_node.html.erb +0 -0
  124. /data/app/components/primer/{open_project → alpha}/file_tree_view/file_node.html.erb +0 -0
  125. /data/app/components/primer/{open_project → alpha}/skeleton_box.css +0 -0
  126. /data/app/components/primer/{open_project → alpha}/skeleton_box.html.erb +0 -0
  127. /data/app/components/primer/{open_project → alpha}/tree_view/icon.html.erb +0 -0
  128. /data/app/components/primer/{open_project → alpha}/tree_view/icon_pair.html.erb +0 -0
  129. /data/app/components/primer/{open_project → alpha}/tree_view/leading_action.html.erb +0 -0
  130. /data/app/components/primer/{open_project → alpha}/tree_view/leaf_node.html.erb +0 -0
  131. /data/app/components/primer/{open_project → alpha}/tree_view/loading_failure_message.html.erb +0 -0
  132. /data/app/components/primer/{open_project → alpha}/tree_view/node.html.erb +0 -0
  133. /data/app/components/primer/{open_project → alpha}/tree_view/sub_tree_container.html.erb +0 -0
  134. /data/app/components/primer/{open_project → alpha}/tree_view/sub_tree_node.html.erb +0 -0
  135. /data/app/components/primer/{open_project → alpha}/tree_view/tree_view_icon_pair_element.d.ts +0 -0
  136. /data/app/components/primer/{open_project → alpha}/tree_view/tree_view_icon_pair_element.js +0 -0
  137. /data/app/components/primer/{open_project → alpha}/tree_view/tree_view_icon_pair_element.ts +0 -0
  138. /data/app/components/primer/{open_project → alpha}/tree_view/tree_view_include_fragment_element.d.ts +0 -0
  139. /data/app/components/primer/{open_project → alpha}/tree_view/tree_view_roving_tab_index.d.ts +0 -0
  140. /data/app/components/primer/{open_project → alpha}/tree_view/tree_view_roving_tab_index.js +0 -0
  141. /data/app/components/primer/{open_project → alpha}/tree_view/tree_view_roving_tab_index.ts +0 -0
  142. /data/app/components/primer/{open_project → alpha}/tree_view/visual.html.erb +0 -0
@@ -41,6 +41,8 @@ module Primer
41
41
  add_input_data(:target, "primer-text-field.inputElement #{system_arguments.dig(:data, :target) || ''}")
42
42
  add_input_classes("FormControl-inset") if inset?
43
43
  add_input_classes("FormControl-monospace") if monospace?
44
+
45
+ yield(self) if block_given?
44
46
  end
45
47
 
46
48
  alias show_clear_button? show_clear_button
@@ -1,4 +1,4 @@
1
- <%= render(Primer::OpenProject::TreeView::SubTree.new(path: ["primer"], node_variant: :div)) do |tree| %>
1
+ <%= render(Primer::Alpha::TreeView::SubTree.new(path: ["primer"], node_variant: :div)) do |tree| %>
2
2
  <% tree.with_sub_tree(label: "alpha") do |sub_tree| %>
3
3
  <% sub_tree.with_leading_visual_icons do |icons| %>
4
4
  <% icons.with_expanded_icon(icon: :"file-directory-open-fill", color: :accent) %>
@@ -1,4 +1,4 @@
1
- <%= render(Primer::OpenProject::TreeView::SubTree.new(path: path, select_variant: select_variant, node_variant: :div)) do |tree| %>
1
+ <%= render(Primer::Alpha::TreeView::SubTree.new(path: path, select_variant: select_variant, node_variant: :div)) do |tree| %>
2
2
  <% next if params[:empty] == "true" %>
3
3
  <% entries.each do |label, type| %>
4
4
  <% case type %>
@@ -0,0 +1,20 @@
1
+ en:
2
+ button_back: "Back"
3
+ button_cancel: "Cancel"
4
+ button_close: "Close"
5
+ button_delete: "Delete"
6
+ button_delete_permanently: "Delete permanently"
7
+ button_filter: "Filter"
8
+ button_save: "Save"
9
+
10
+ filterable_tree_view:
11
+ filter_mode:
12
+ all: "All"
13
+ label: "Filter mode"
14
+ selected: "Selected"
15
+ include_sub_items: "Include sub-items"
16
+ no_results_text: "No results"
17
+
18
+ label_title: "Title"
19
+ label_loading: "Loading..."
20
+ label_more: "More"
@@ -5,8 +5,8 @@ module Primer
5
5
  module ViewComponents
6
6
  module VERSION
7
7
  MAJOR = 0
8
- MINOR = 70
9
- PATCH = 5
8
+ MINOR = 72
9
+ PATCH = 0
10
10
 
11
11
  STRING = [MAJOR, MINOR, PATCH].join(".")
12
12
  end
@@ -1,5 +1,5 @@
1
1
  <div style="max-width: 400px">
2
- <%= render(Primer::OpenProject::FileTreeView.new) do |tree_view| %>
2
+ <%= render(Primer::Alpha::FileTreeView.new) do |tree_view| %>
3
3
  <% tree_view.with_directory(label: "src", expanded: expanded, select_variant: select_variant) do |dir| %>
4
4
  <% dir.with_trailing_visual_icon(icon: :"diff-modified") %>
5
5
 
@@ -1,4 +1,4 @@
1
1
  <% data = Primer::ViewComponents::TreeViewItemsController::TREE %>
2
- <%= render(Primer::OpenProject::FileTreeView.new) do |tree| %>
2
+ <%= render(Primer::Alpha::FileTreeView.new) do |tree| %>
3
3
  <% populate.call(tree, data, { select_variant: select_variant, expanded: expanded }) %>
4
4
  <% end %>
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
- module OpenProject
4
+ module Alpha
5
5
  # @label FileTreeView
6
6
  class FileTreeViewPreview < ViewComponent::Preview
7
7
  # @label Default
@@ -1,19 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
- module OpenProject
4
+ module Alpha
5
5
  # @label SkeletonBox
6
6
  class SkeletonBoxPreview < ViewComponent::Preview
7
7
  # @label Default
8
8
  def default
9
- render(Primer::OpenProject::SkeletonBox.new(width: "64px", height: "64px"))
9
+ render(Primer::Alpha::SkeletonBox.new(width: "64px", height: "64px"))
10
10
  end
11
11
 
12
12
  # @label Playground
13
13
  # @param width text
14
14
  # @param height text
15
15
  def playground(width: "64px", height: "64px")
16
- render(Primer::OpenProject::SkeletonBox.new(width: width, height: height))
16
+ render(Primer::Alpha::SkeletonBox.new(width: width, height: height))
17
17
  end
18
18
  end
19
19
  end
@@ -1,5 +1,5 @@
1
1
  <div style="max-width: 400px">
2
- <%= render(Primer::OpenProject::TreeView.new) do |tree_view| %>
2
+ <%= render(Primer::Alpha::TreeView.new) do |tree_view| %>
3
3
  <% tree_view.with_sub_tree(label: "primer") do |sub_tree| %>
4
4
  <% sub_tree.with_leading_visual_icons do |icons| %>
5
5
  <% icons.with_expanded_icon(icon: :"file-directory-open-fill", color: :accent) %>
@@ -1,10 +1,10 @@
1
1
  <div style="max-width: 400px">
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')") %>
2
+ <%= render(Primer::Alpha::TreeView.new(node_variant: :button)) do |tree_view| %>
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
- <%= 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| %>
2
+ <%= render(Primer::Alpha::TreeView.new) do |tree_view| %>
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", current: true, disabled: disabled, 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
  <div style="max-width: 400px">
2
- <%= render(Primer::OpenProject::TreeView.new) do |tree_view| %>
2
+ <%= render(Primer::Alpha::TreeView.new) do |tree_view| %>
3
3
  <% tree_view.with_sub_tree(label: "src") do |sub_tree| %>
4
4
  <% sub_tree.with_leading_visual_icons do |icons| %>
5
5
  <% icons.with_expanded_icon(icon: :"file-directory-open-fill", color: :accent) %>
@@ -0,0 +1,14 @@
1
+ <%= form_with(url: primer_view_components.generic_form_submission_path(format: :json)) do |f| %>
2
+ <%= render(Primer::Alpha::Stack.new) do %>
3
+ <%= render(Primer::Alpha::TreeView.new(form_arguments: { builder: f, name: "folder_structure" })) do |tree| %>
4
+ <% tree.with_sub_tree(label: "src", expanded: expanded, select_variant: :multiple, value: 0) do |sub_tree| %>
5
+ <% sub_tree.with_leaf(label: "button.rb", select_variant: :multiple, value: 1) %>
6
+ <% sub_tree.with_leaf(label: "icon_button.rb", current: true, select_variant: :multiple, value: 2) %>
7
+ <% end %>
8
+
9
+ <% tree.with_leaf(label: "action_menu.rb", select_variant: :multiple, value: 3) %>
10
+ <% end %>
11
+
12
+ <%= render(Primer::Alpha::SubmitButton.new(name: :submit, label: "Submit")) %>
13
+ <% end %>
14
+ <% end %>
@@ -1,5 +1,5 @@
1
- <%= render(Primer::OpenProject::TreeView.new) do |tree| %>
2
- <% tree.with_leaf(label: label, select_variant: select_variant) do |node| %>
1
+ <%= render(Primer::Alpha::TreeView.new) do |tree| %>
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
- <%= 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| %>
2
+ <%= render(Primer::Alpha::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, 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 %>
@@ -1,7 +1,7 @@
1
1
  <% subject_id = SecureRandom.hex %>
2
2
 
3
3
  <div style="max-width: 400px">
4
- <%= render(Primer::OpenProject::TreeView.new(data: { interaction_subject: subject_id })) do |tree_view| %>
4
+ <%= render(Primer::Alpha::TreeView.new(data: { interaction_subject: subject_id })) do |tree_view| %>
5
5
  <% tree_view.with_sub_tree(label: "primer") do |sub_tree| %>
6
6
  <% sub_tree.with_leading_visual_icons do |icons| %>
7
7
  <% icons.with_expanded_icon(icon: :"file-directory-open-fill", color: :accent) %>
@@ -1,5 +1,5 @@
1
1
  <div style="max-width: 400px">
2
- <%= render(Primer::OpenProject::TreeView.new) do |tree_view| %>
2
+ <%= render(Primer::Alpha::TreeView.new) do |tree_view| %>
3
3
  <% tree_view.with_sub_tree(label: "primer") do |sub_tree| %>
4
4
  <% sub_tree.with_leading_visual_icons do |icons| %>
5
5
  <% icons.with_expanded_icon(icon: :"file-directory-open-fill", color: :accent) %>
@@ -1,5 +1,5 @@
1
1
  <div style="max-width: 400px">
2
- <%= render(Primer::OpenProject::TreeView.new) do |tree_view| %>
2
+ <%= render(Primer::Alpha::TreeView.new) do |tree_view| %>
3
3
  <% tree_view.with_sub_tree(label: "primer") do |sub_tree| %>
4
4
  <% sub_tree.with_leading_visual_icons do |icons| %>
5
5
  <% icons.with_expanded_icon(icon: :"file-directory-open-fill", color: :accent) %>
@@ -1,4 +1,4 @@
1
1
  <% data = Primer::ViewComponents::TreeViewItemsController::TREE %>
2
- <%= render(Primer::OpenProject::TreeView.new) do |tree| %>
2
+ <%= render(Primer::Alpha::TreeView.new) do |tree| %>
3
3
  <% populate.call(tree, data, { select_variant: select_variant, select_strategy: select_strategy, expanded: expanded }) %>
4
4
  <% end %>
@@ -1,22 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
- module OpenProject
4
+ module Alpha
5
5
  # @label TreeView
6
6
  class TreeViewPreview < ViewComponent::Preview
7
7
  # @label Default
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,
15
- select_variant: Primer::OpenProject::TreeView::Node::DEFAULT_SELECT_VARIANT,
16
- select_strategy: Primer::OpenProject::TreeView::SubTreeNode::DEFAULT_SELECT_STRATEGY
16
+ disabled: false,
17
+ select_variant: Primer::Alpha::TreeView::Node::DEFAULT_SELECT_VARIANT,
18
+ select_strategy: Primer::Alpha::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,11 +29,11 @@ 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
- select_variant: Primer::OpenProject::TreeView::Node::DEFAULT_SELECT_VARIANT,
33
- select_strategy: Primer::OpenProject::TreeView::SubTreeNode::DEFAULT_SELECT_STRATEGY
35
+ select_variant: Primer::Alpha::TreeView::Node::DEFAULT_SELECT_VARIANT,
36
+ select_strategy: Primer::Alpha::TreeView::SubTreeNode::DEFAULT_SELECT_STRATEGY
34
37
  )
35
38
  render_with_template(locals: {
36
39
  expanded: coerce_bool(expanded),
@@ -92,44 +95,51 @@ 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::Alpha::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
 
129
139
  # @label Auto expansion
130
140
  #
131
141
  def auto_expansion
132
- render(Primer::OpenProject::TreeView.new) do |tree|
142
+ render(Primer::Alpha::TreeView.new) do |tree|
133
143
  tree.with_sub_tree(label: "Level 1") do |level1|
134
144
  level1.with_sub_tree(label: "Level 2") do |level2|
135
145
  # marking this node as expanded should automatically expand all ancestors
@@ -141,6 +151,15 @@ module Primer
141
151
  end
142
152
  end
143
153
 
154
+ # @label Form input
155
+ #
156
+ # @param expanded [Boolean] toggle
157
+ def form_input(expanded: true)
158
+ render_with_template(locals: {
159
+ expanded: coerce_bool(expanded)
160
+ })
161
+ end
162
+
144
163
  private
145
164
 
146
165
  def coerce_bool(value)
@@ -161,7 +180,7 @@ module Primer
161
180
 
162
181
  entries = (
163
182
  data.fetch("children", {}).keys.map { |label, idx| [label, :directory] } +
164
- data.fetch("files", []).map { |label| [label, :file] }
183
+ data.fetch("files", []).map { |label| [label, :file] }
165
184
  )
166
185
 
167
186
  entries.sort_by!(&:first)
@@ -0,0 +1,62 @@
1
+ <script>
2
+ function ready(fn) {
3
+ if (document.readyState !== 'loading') {
4
+ fn()
5
+ } else {
6
+ document.addEventListener('DOMContentLoaded', fn)
7
+ }
8
+ }
9
+
10
+ ready(() => {
11
+ const filterableTreeView = document.querySelector('filterable-tree-view')
12
+ filterableTreeView.filterFn = (node, query, filterMode) => {
13
+ const ranges = []
14
+
15
+ if (query.length > 0) {
16
+ const lowercaseQuery = query.toLowerCase()
17
+ const treeWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT)
18
+ let currentNode = treeWalker.nextNode()
19
+
20
+ while (currentNode) {
21
+ const lowercaseNodeText = currentNode.textContent?.toLocaleLowerCase() || ''
22
+ let startIndex = 0
23
+
24
+ while (startIndex < lowercaseNodeText.length) {
25
+ const index = lowercaseNodeText.indexOf(lowercaseQuery, startIndex)
26
+ if (index === -1) break
27
+
28
+ const range = new Range()
29
+ range.setStart(currentNode, index)
30
+ range.setEnd(currentNode, index + lowercaseQuery.length)
31
+ ranges.push(range)
32
+
33
+ startIndex = index + lowercaseQuery.length
34
+ }
35
+
36
+ currentNode = treeWalker.nextNode()
37
+ }
38
+ }
39
+
40
+ if (ranges.length === 0 && query.length > 0) {
41
+ return null
42
+ }
43
+
44
+ switch (filterMode) {
45
+ case 'teacher': {
46
+ // Only match nodes that are teachers
47
+ if (!node.dataset.path.includes('Students')) {
48
+ return ranges
49
+ }
50
+
51
+ break
52
+ }
53
+
54
+ case 'all': {
55
+ return ranges
56
+ }
57
+ }
58
+
59
+ return null
60
+ }
61
+ })
62
+ </script>
@@ -0,0 +1,26 @@
1
+ <%= render(Primer::OpenProject::FilterableTreeView.new(include_sub_items_check_box_arguments: { name: :include_sub_items, label: "Including pupils" })) 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,28 @@
1
+ <%= render(Primer::OpenProject::FilterableTreeView.new(
2
+ filter_input_arguments: {placeholder: "Search me!", name: "filter", label: "Filter", visually_hide_label: true},
3
+ no_results_node_arguments: { label: "All wizards and witches have left the building" })) do |tree| %>
4
+ <% tree.with_sub_tree(label: "Students", expanded: expanded) do |hogwarts| %>
5
+ <% hogwarts.with_sub_tree(label: "Ravenclaw", expanded: expanded) do |ravenclaw| %>
6
+ <% ravenclaw.with_leaf(label: "Luna Lovegood") %>
7
+ <% end %>
8
+
9
+ <% hogwarts.with_sub_tree(label: "Slytherin", expanded: expanded) do |hufflepuff| %>
10
+ <% hufflepuff.with_leaf(label: "Draco Malfoy") %>
11
+ <% end %>
12
+
13
+ <% hogwarts.with_sub_tree(label: "Hufflepuff", expanded: expanded) do |hufflepuff| %>
14
+ <% hufflepuff.with_leaf(label: "Susan Bones") %>
15
+ <% end %>
16
+
17
+ <% hogwarts.with_sub_tree(label: "Gryffindor", expanded: expanded) do |hufflepuff| %>
18
+ <% hufflepuff.with_leaf(label: "Harry Potter") %>
19
+ <% hufflepuff.with_leaf(label: "Ronald Weasley") %>
20
+ <% hufflepuff.with_leaf(label: "Hermione Granger") %>
21
+ <% end %>
22
+ <% end %>
23
+
24
+ <% tree.with_leaf(label: "Albus Dumbledore") %>
25
+ <% tree.with_leaf(label: "Minerva McGonagall") %>
26
+ <% tree.with_leaf(label: "Severus Snape") %>
27
+ <% tree.with_leaf(label: "Rubeus Hagrid") %>
28
+ <% end %>
@@ -0,0 +1,31 @@
1
+ <%= render(Primer::OpenProject::FilterableTreeView.new) do |tree| %>
2
+ <% tree.with_filter_mode(name: "teacher", label: "Teacher") %>
3
+ <% tree.with_filter_mode(name: "all", label: "All", selected: true) %>
4
+
5
+ <% tree.with_sub_tree(label: "Students", expanded: expanded) do |hogwarts| %>
6
+ <% hogwarts.with_sub_tree(label: "Ravenclaw", expanded: expanded) do |ravenclaw| %>
7
+ <% ravenclaw.with_leaf(label: "Luna Lovegood") %>
8
+ <% end %>
9
+
10
+ <% hogwarts.with_sub_tree(label: "Slytherin", expanded: expanded) do |hufflepuff| %>
11
+ <% hufflepuff.with_leaf(label: "Draco Malfoy") %>
12
+ <% end %>
13
+
14
+ <% hogwarts.with_sub_tree(label: "Hufflepuff", expanded: expanded) do |hufflepuff| %>
15
+ <% hufflepuff.with_leaf(label: "Susan Bones") %>
16
+ <% end %>
17
+
18
+ <% hogwarts.with_sub_tree(label: "Gryffindor", expanded: expanded) do |hufflepuff| %>
19
+ <% hufflepuff.with_leaf(label: "Harry Potter") %>
20
+ <% hufflepuff.with_leaf(label: "Ronald Weasley") %>
21
+ <% hufflepuff.with_leaf(label: "Hermione Granger") %>
22
+ <% end %>
23
+ <% end %>
24
+
25
+ <% tree.with_leaf(label: "Albus Dumbledore") %>
26
+ <% tree.with_leaf(label: "Minerva McGonagall") %>
27
+ <% tree.with_leaf(label: "Severus Snape") %>
28
+ <% tree.with_leaf(label: "Rubeus Hagrid") %>
29
+ <% end %>
30
+
31
+ <%= render partial: "primer/open_project/filterable_tree_view_preview/custom_select_js", locals: { } %>
@@ -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,32 @@
1
+ <%= form_with(url: primer_view_components.generic_form_submission_path(format: :json)) do |f| %>
2
+ <%= render(Primer::Alpha::Stack.new) do %>
3
+ <%= render(Primer::OpenProject::FilterableTreeView.new(form_arguments: { builder: f, name: "characters" })) do |tree| %>
4
+ <% tree.with_sub_tree(label: "Students", expanded: expanded) do |hogwarts| %>
5
+ <% hogwarts.with_sub_tree(label: "Ravenclaw", expanded: expanded) do |ravenclaw| %>
6
+ <% ravenclaw.with_leaf(label: "Luna Lovegood") %>
7
+ <% end %>
8
+
9
+ <% hogwarts.with_sub_tree(label: "Slytherin", expanded: expanded) do |hufflepuff| %>
10
+ <% hufflepuff.with_leaf(label: "Draco Malfoy") %>
11
+ <% end %>
12
+
13
+ <% hogwarts.with_sub_tree(label: "Hufflepuff", expanded: expanded) do |hufflepuff| %>
14
+ <% hufflepuff.with_leaf(label: "Susan Bones") %>
15
+ <% end %>
16
+
17
+ <% hogwarts.with_sub_tree(label: "Gryffindor", expanded: expanded) do |hufflepuff| %>
18
+ <% hufflepuff.with_leaf(label: "Harry Potter") %>
19
+ <% hufflepuff.with_leaf(label: "Ronald Weasley") %>
20
+ <% hufflepuff.with_leaf(label: "Hermione Granger") %>
21
+ <% end %>
22
+ <% end %>
23
+
24
+ <% tree.with_leaf(label: "Albus Dumbledore") %>
25
+ <% tree.with_leaf(label: "Minerva McGonagall") %>
26
+ <% tree.with_leaf(label: "Severus Snape") %>
27
+ <% tree.with_leaf(label: "Rubeus Hagrid") %>
28
+ <% end %>
29
+
30
+ <%= render(Primer::Alpha::SubmitButton.new(name: :submit, label: "Submit")) %>
31
+ <% end %>
32
+ <% end %>
@@ -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 %>