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
@@ -0,0 +1,28 @@
|
|
1
|
+
<%= render(Primer::OpenProject::FilterableTreeView.new) do |tree| %>
|
2
|
+
<% (1..500).each do %>
|
3
|
+
<% tree.with_sub_tree(label: "Students", expanded: expanded) do |hogwarts| %>
|
4
|
+
<% hogwarts.with_sub_tree(label: "Ravenclaw", expanded: expanded) do |ravenclaw| %>
|
5
|
+
<% ravenclaw.with_leaf(label: "Luna Lovegood") %>
|
6
|
+
<% end %>
|
7
|
+
|
8
|
+
<% hogwarts.with_sub_tree(label: "Slytherin", expanded: expanded) do |hufflepuff| %>
|
9
|
+
<% hufflepuff.with_leaf(label: "Draco Malfoy") %>
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
<% hogwarts.with_sub_tree(label: "Hufflepuff", expanded: expanded) do |hufflepuff| %>
|
13
|
+
<% hufflepuff.with_leaf(label: "Susan Bones") %>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<% hogwarts.with_sub_tree(label: "Gryffindor", expanded: expanded) do |hufflepuff| %>
|
17
|
+
<% hufflepuff.with_leaf(label: "Harry Potter") %>
|
18
|
+
<% hufflepuff.with_leaf(label: "Ronald Weasley") %>
|
19
|
+
<% hufflepuff.with_leaf(label: "Hermione Granger") %>
|
20
|
+
<% end %>
|
21
|
+
<% end %>
|
22
|
+
|
23
|
+
<% tree.with_leaf(label: "Albus Dumbledore") %>
|
24
|
+
<% tree.with_leaf(label: "Minerva McGonagall") %>
|
25
|
+
<% tree.with_leaf(label: "Severus Snape") %>
|
26
|
+
<% tree.with_leaf(label: "Rubeus Hagrid") %>
|
27
|
+
<% end %>
|
28
|
+
<% 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
|