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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -0
- data/app/assets/javascripts/components/primer/alpha/segmented_control.d.ts +2 -2
- data/app/assets/javascripts/components/primer/{open_project → alpha}/tree_view/tree_view.d.ts +11 -1
- data/app/assets/javascripts/components/primer/{open_project → alpha}/tree_view/tree_view_sub_tree_node_element.d.ts +5 -1
- data/app/assets/javascripts/components/primer/open_project/filterable_tree_view.d.ts +29 -0
- data/app/assets/javascripts/components/primer/primer.d.ts +5 -4
- data/app/assets/javascripts/primer_view_components.js +1 -1
- data/app/assets/javascripts/primer_view_components.js.map +1 -1
- data/app/assets/styles/primer_view_components.css +1 -1
- data/app/assets/styles/primer_view_components.css.map +1 -1
- data/app/components/primer/{open_project → alpha}/file_tree_view/directory_node.rb +1 -1
- data/app/components/primer/{open_project → alpha}/file_tree_view/file_node.rb +1 -1
- data/app/components/primer/{open_project → alpha}/file_tree_view.rb +1 -1
- data/app/components/primer/alpha/segmented_control.d.ts +2 -2
- data/app/components/primer/alpha/segmented_control.js +12 -0
- data/app/components/primer/alpha/segmented_control.ts +16 -1
- data/app/components/primer/{open_project → alpha}/skeleton_box.css.json +1 -1
- data/app/components/primer/{open_project → alpha}/skeleton_box.css.map +1 -1
- data/app/components/primer/{open_project → alpha}/skeleton_box.pcss +1 -1
- data/app/components/primer/{open_project → alpha}/skeleton_box.rb +3 -1
- data/app/components/primer/alpha/stack.css +1 -1
- data/app/components/primer/alpha/stack.css.json +5 -1
- data/app/components/primer/alpha/stack.css.map +1 -1
- data/app/components/primer/alpha/stack.pcss +13 -0
- data/app/components/primer/alpha/stack.rb +2 -1
- data/app/components/primer/{open_project → alpha}/tree_view/icon.rb +2 -2
- data/app/components/primer/{open_project → alpha}/tree_view/icon_pair.rb +4 -4
- data/app/components/primer/{open_project → alpha}/tree_view/leading_action.rb +2 -2
- data/app/components/primer/{open_project → alpha}/tree_view/leaf_node.rb +6 -6
- data/app/components/primer/{open_project → alpha}/tree_view/loading_failure_message.rb +2 -2
- data/app/components/primer/{open_project → alpha}/tree_view/node.rb +30 -14
- data/app/components/primer/{open_project → alpha}/tree_view/skeleton_loader.html.erb +3 -3
- data/app/components/primer/{open_project → alpha}/tree_view/skeleton_loader.rb +4 -4
- data/app/components/primer/{open_project → alpha}/tree_view/spinner_loader.html.erb +2 -2
- data/app/components/primer/{open_project → alpha}/tree_view/spinner_loader.rb +4 -4
- data/app/components/primer/{open_project → alpha}/tree_view/sub_tree.html.erb +1 -1
- data/app/components/primer/{open_project → alpha}/tree_view/sub_tree.rb +10 -10
- data/app/components/primer/{open_project → alpha}/tree_view/sub_tree_container.rb +2 -2
- data/app/components/primer/{open_project → alpha}/tree_view/sub_tree_node.rb +28 -18
- data/app/components/primer/{open_project → alpha}/tree_view/tree_view.d.ts +11 -1
- data/app/components/primer/{open_project → alpha}/tree_view/tree_view.js +120 -20
- data/app/components/primer/{open_project → alpha}/tree_view/tree_view.ts +137 -18
- data/app/components/primer/{open_project → alpha}/tree_view/tree_view_include_fragment_element.js +0 -1
- data/app/components/primer/{open_project → alpha}/tree_view/tree_view_include_fragment_element.ts +0 -1
- data/app/components/primer/{open_project → alpha}/tree_view/tree_view_sub_tree_node_element.d.ts +5 -1
- data/app/components/primer/{open_project → alpha}/tree_view/tree_view_sub_tree_node_element.js +27 -4
- data/app/components/primer/{open_project → alpha}/tree_view/tree_view_sub_tree_node_element.ts +36 -5
- data/app/components/primer/{open_project → alpha}/tree_view/visual.rb +2 -2
- data/app/components/primer/alpha/tree_view.css +1 -0
- data/app/components/primer/{open_project → alpha}/tree_view.css.json +8 -1
- data/app/components/primer/alpha/tree_view.css.map +1 -0
- data/app/components/primer/alpha/tree_view.html.erb +12 -0
- data/app/components/primer/{open_project → alpha}/tree_view.pcss +39 -0
- data/app/components/primer/{open_project → alpha}/tree_view.rb +20 -12
- data/app/components/primer/beta/breadcrumbs.css +1 -1
- data/app/components/primer/beta/breadcrumbs.css.json +0 -1
- data/app/components/primer/beta/breadcrumbs.css.map +1 -1
- data/app/components/primer/beta/breadcrumbs.pcss +2 -8
- data/app/components/primer/beta/progress_bar.css +1 -1
- data/app/components/primer/beta/progress_bar.css.map +1 -1
- data/app/components/primer/beta/progress_bar.pcss +3 -2
- data/app/components/primer/beta/relative_time.rb +3 -0
- data/app/components/primer/open_project/filterable_tree_view/sub_tree.rb +39 -0
- data/app/components/primer/open_project/filterable_tree_view.d.ts +29 -0
- data/app/components/primer/open_project/filterable_tree_view.html.erb +28 -0
- data/app/components/primer/open_project/filterable_tree_view.js +409 -0
- data/app/components/primer/open_project/filterable_tree_view.rb +254 -0
- data/app/components/primer/open_project/filterable_tree_view.ts +492 -0
- data/app/components/primer/primer.d.ts +5 -4
- data/app/components/primer/primer.js +5 -4
- data/app/components/primer/primer.pcss +2 -2
- data/app/components/primer/primer.ts +5 -4
- data/app/controllers/primer/view_components/tree_view_items_controller.rb +1 -1
- data/app/forms/check_box_with_nested_form.rb +10 -10
- data/app/forms/radio_button_with_nested_form.rb +16 -16
- data/app/lib/primer/experimental_slot_helpers.rb +2 -2
- data/app/lib/primer/forms/base_component.rb +1 -1
- data/app/lib/primer/forms/dsl/text_field_input.rb +2 -0
- data/app/views/primer/view_components/tree_view_items/async_alpha.html_fragment.erb +1 -1
- data/app/views/primer/view_components/tree_view_items/index.html_fragment.erb +1 -1
- data/config/locales/en.yml +20 -0
- data/lib/primer/view_components/version.rb +2 -2
- data/previews/primer/{open_project → alpha}/file_tree_view_preview/default.html.erb +1 -1
- data/previews/primer/{open_project → alpha}/file_tree_view_preview/playground.html.erb +1 -1
- data/previews/primer/{open_project → alpha}/file_tree_view_preview.rb +1 -1
- data/previews/primer/{open_project → alpha}/skeleton_box_preview.rb +3 -3
- data/previews/primer/{open_project → alpha}/tree_view_preview/async_alpha.html.erb +1 -1
- data/previews/primer/{open_project → alpha}/tree_view_preview/buttons.html.erb +5 -5
- data/previews/primer/{open_project → alpha}/tree_view_preview/default.html.erb +5 -5
- data/previews/primer/{open_project → alpha}/tree_view_preview/empty.html.erb +1 -1
- data/previews/primer/alpha/tree_view_preview/form_input.html.erb +14 -0
- data/previews/primer/{open_project → alpha}/tree_view_preview/leaf_node_playground.html.erb +2 -2
- data/previews/primer/{open_project → alpha}/tree_view_preview/links.html.erb +5 -5
- data/previews/primer/{open_project → alpha}/tree_view_preview/loading_failure.html.erb +1 -1
- data/previews/primer/{open_project → alpha}/tree_view_preview/loading_skeleton.html.erb +1 -1
- data/previews/primer/{open_project → alpha}/tree_view_preview/loading_spinner.html.erb +1 -1
- data/previews/primer/{open_project → alpha}/tree_view_preview/playground.html.erb +1 -1
- data/previews/primer/{open_project → alpha}/tree_view_preview.rb +34 -15
- data/previews/primer/open_project/filterable_tree_view_preview/_custom_select_js.html.erb +62 -0
- data/previews/primer/open_project/filterable_tree_view_preview/custom_checkbox_text.html.erb +26 -0
- data/previews/primer/open_project/filterable_tree_view_preview/custom_no_results_text.html.erb +28 -0
- data/previews/primer/open_project/filterable_tree_view_preview/custom_segmented_control.html.erb +31 -0
- data/previews/primer/open_project/filterable_tree_view_preview/default.html.erb +26 -0
- data/previews/primer/open_project/filterable_tree_view_preview/form_input.html.erb +32 -0
- data/previews/primer/open_project/filterable_tree_view_preview/playground.html.erb +26 -0
- data/previews/primer/open_project/filterable_tree_view_preview/stress_test.html.erb +28 -0
- data/previews/primer/open_project/filterable_tree_view_preview.rb +125 -0
- data/static/arguments.json +1685 -1581
- data/static/audited_at.json +19 -17
- data/static/classes.json +5 -5
- data/static/constants.json +137 -98
- data/static/info_arch.json +6396 -6146
- data/static/previews.json +120 -21
- data/static/statuses.json +19 -17
- metadata +102 -84
- data/app/components/primer/open_project/tree_view.css +0 -1
- data/app/components/primer/open_project/tree_view.css.map +0 -1
- data/app/components/primer/open_project/tree_view.html.erb +0 -7
- /data/app/assets/javascripts/components/primer/{open_project → alpha}/tree_view/tree_view_icon_pair_element.d.ts +0 -0
- /data/app/assets/javascripts/components/primer/{open_project → alpha}/tree_view/tree_view_include_fragment_element.d.ts +0 -0
- /data/app/assets/javascripts/components/primer/{open_project → alpha}/tree_view/tree_view_roving_tab_index.d.ts +0 -0
- /data/app/components/primer/{open_project → alpha}/file_tree_view/directory_node.html.erb +0 -0
- /data/app/components/primer/{open_project → alpha}/file_tree_view/file_node.html.erb +0 -0
- /data/app/components/primer/{open_project → alpha}/skeleton_box.css +0 -0
- /data/app/components/primer/{open_project → alpha}/skeleton_box.html.erb +0 -0
- /data/app/components/primer/{open_project → alpha}/tree_view/icon.html.erb +0 -0
- /data/app/components/primer/{open_project → alpha}/tree_view/icon_pair.html.erb +0 -0
- /data/app/components/primer/{open_project → alpha}/tree_view/leading_action.html.erb +0 -0
- /data/app/components/primer/{open_project → alpha}/tree_view/leaf_node.html.erb +0 -0
- /data/app/components/primer/{open_project → alpha}/tree_view/loading_failure_message.html.erb +0 -0
- /data/app/components/primer/{open_project → alpha}/tree_view/node.html.erb +0 -0
- /data/app/components/primer/{open_project → alpha}/tree_view/sub_tree_container.html.erb +0 -0
- /data/app/components/primer/{open_project → alpha}/tree_view/sub_tree_node.html.erb +0 -0
- /data/app/components/primer/{open_project → alpha}/tree_view/tree_view_icon_pair_element.d.ts +0 -0
- /data/app/components/primer/{open_project → alpha}/tree_view/tree_view_icon_pair_element.js +0 -0
- /data/app/components/primer/{open_project → alpha}/tree_view/tree_view_icon_pair_element.ts +0 -0
- /data/app/components/primer/{open_project → alpha}/tree_view/tree_view_include_fragment_element.d.ts +0 -0
- /data/app/components/primer/{open_project → alpha}/tree_view/tree_view_roving_tab_index.d.ts +0 -0
- /data/app/components/primer/{open_project → alpha}/tree_view/tree_view_roving_tab_index.js +0 -0
- /data/app/components/primer/{open_project → alpha}/tree_view/tree_view_roving_tab_index.ts +0 -0
- /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::
|
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::
|
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"
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<div style="max-width: 400px">
|
2
|
-
<%= render(Primer::
|
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::
|
2
|
+
<%= render(Primer::Alpha::FileTreeView.new) do |tree| %>
|
3
3
|
<% populate.call(tree, data, { select_variant: select_variant, expanded: expanded }) %>
|
4
4
|
<% end %>
|
@@ -1,19 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Primer
|
4
|
-
module
|
4
|
+
module Alpha
|
5
5
|
# @label SkeletonBox
|
6
6
|
class SkeletonBoxPreview < ViewComponent::Preview
|
7
7
|
# @label Default
|
8
8
|
def default
|
9
|
-
render(Primer::
|
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::
|
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::
|
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::
|
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::
|
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::
|
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::
|
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::
|
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::
|
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::
|
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::
|
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::
|
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
|
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
|
-
|
16
|
-
|
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::
|
33
|
-
select_strategy: Primer::
|
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::
|
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
|
-
|
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
|
-
|
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::
|
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
|
-
|
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 %>
|
data/previews/primer/open_project/filterable_tree_view_preview/custom_no_results_text.html.erb
ADDED
@@ -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 %>
|
data/previews/primer/open_project/filterable_tree_view_preview/custom_segmented_control.html.erb
ADDED
@@ -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 %>
|