card-mod-search 0.14.1 → 0.15.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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -0
  3. data/assets/script/autocomplete.js.coffee +36 -0
  4. data/assets/script/search_box.js.coffee +24 -0
  5. data/assets/style/search.scss +69 -0
  6. data/data/files/mod_search_script_asset_output/file.js +4 -0
  7. data/data/real.yml +112 -0
  8. data/data/test.yml +18 -0
  9. data/lib/card/mod/search.rb +4 -0
  10. data/locales/en.yml +4 -0
  11. data/set/abstract/0_search/checkbox_item.haml +6 -0
  12. data/set/abstract/{02_search_params.rb → 0_search/search_params.rb} +2 -4
  13. data/set/abstract/{05_search → 0_search}/views.rb +32 -46
  14. data/set/abstract/{05_search.rb → 0_search.rb} +3 -9
  15. data/set/abstract/{06_cql_search.rb → cql_search.rb} +3 -6
  16. data/set/abstract/search_views.rb +1 -2
  17. data/set/abstract/virtual_search.rb +3 -0
  18. data/set/all/autocomplete/autocomplete_input.haml +3 -0
  19. data/set/all/autocomplete/autocomplete_item.haml +5 -0
  20. data/set/all/autocomplete.rb +48 -0
  21. data/set/right/by_create.rb +7 -0
  22. data/set/right/by_name.rb +7 -0
  23. data/set/right/by_update.rb +7 -0
  24. data/set/right/children.rb +8 -0
  25. data/set/right/count.rb +9 -0
  26. data/set/right/created.rb +8 -0
  27. data/set/right/creator.rb +7 -0
  28. data/set/right/edited.rb +8 -0
  29. data/set/right/editors.rb +8 -0
  30. data/set/right/last_edited.rb +7 -0
  31. data/set/right/linked_to_by.rb +8 -0
  32. data/set/right/links_to.rb +7 -1
  33. data/set/right/mates.rb +9 -1
  34. data/set/right/nested_by.rb +9 -1
  35. data/set/right/nests.rb +8 -0
  36. data/set/right/referred_to_by.rb +8 -0
  37. data/set/right/refers_to.rb +8 -0
  38. data/set/self/recent.rb +38 -4
  39. data/set/self/search/results_for_keyword.haml +5 -0
  40. data/set/self/search/search_box.haml +2 -0
  41. data/set/self/search.rb +88 -40
  42. data/set/type/cardtype.rb +11 -1
  43. metadata +62 -28
  44. data/lib/card/filter_query.rb +0 -78
  45. data/set/abstract/00_filter_helper.rb +0 -46
  46. data/set/abstract/03_filter/_filter_input.haml +0 -8
  47. data/set/abstract/03_filter/filter_form.haml +0 -56
  48. data/set/abstract/03_filter/filter_form.rb +0 -101
  49. data/set/abstract/03_filter/filtered_content.haml +0 -5
  50. data/set/abstract/03_filter/form_helper.rb +0 -105
  51. data/set/abstract/03_filter/query_construction.rb +0 -38
  52. data/set/abstract/03_filter/quick_filters.haml +0 -11
  53. data/set/abstract/03_filter/selectable_filtered_content.haml +0 -2
  54. data/set/abstract/03_filter.rb +0 -30
  55. data/set/abstract/05_search/checkbox_item.haml +0 -5
  56. data/set/abstract/05_search/select_item.haml +0 -15
  57. data/set/abstract/filter_list.rb +0 -11
  58. data/set/abstract/filterable.rb +0 -13
  59. data/set/abstract/filterable_bar.rb +0 -11
  60. data/set/right/follow.rb +0 -3
@@ -1,56 +0,0 @@
1
-
2
- .card.w-100.nodblclick
3
- .card-body
4
- ._filter-widget
5
- // FILTERING PROTOTYPES
6
- ._filter-input-field-prototypes.d-none
7
- - categories.each do |key, category|
8
- = haml_partial :filter_input, key: key, category: category
9
-
10
-
11
- // FORM
12
- %form._filter-form{form_args, "accept-charset": "UTF-8",
13
- "data-remote": "true",
14
- method: "get"}
15
- - not_ids = params.dig :filter, :not_ids
16
- %input{ type: :hidden,
17
- name: "filter[not_ids]",
18
- class: "_not-ids",
19
- value: not_ids }
20
- = render_quick_filters
21
- .filter-and-sort.d-flex.flex-wrap
22
- - if sort_input_field.present?
23
- // SORTING
24
- .sort-in-filter-form
25
- %i.fa.fa-sort.filter-section-icon
26
- .input-group.input-group-sm.flex-nowrap.sort-input-group.mb-2.mr-2
27
- .input-group-prepend
28
- %span.input-group-text.text-muted Sort
29
- = sort_input_field
30
-
31
- // FILTERING
32
- .filter-in-filter-form
33
- %i.fa.fa-filter.filter-section-icon
34
- ._filter-container.d-flex.flew-row.flex-wrap
35
- // FILTERS inserted here
36
-
37
- // ADD FILTER DROPDOWN
38
- .dropdown._add-filter-dropdown.mr-2
39
- %button.btn.btn-sm.btn-primary.dropdown-toggle{"aria-expanded": "false",
40
- "aria-haspopup": "true",
41
- "data-toggle": "dropdown",
42
- type: "button" }
43
- More Filters
44
- .dropdown-menu
45
- - categories.each do |key, category|
46
- %a{ class: "dropdown-item _filter-category-select",
47
- href: "#",
48
- "data-category": key,
49
- "data-label": category[:label],
50
- "data-active": ("true" if category[:active])}
51
- = category[:label]
52
-
53
- // RESET BUTTON
54
- ._reset-filter{ "data-reset": reset_filter_data }
55
- %button.btn.btn-sm.btn-secondary{ type: "button" }
56
- %i.fa.fa-sync-alt
@@ -1,101 +0,0 @@
1
- format :html do
2
- # sort and filter ui
3
- view :filter_form, cache: :never do
4
- filter_fields slot_selector: "._filter-result-slot",
5
- sort_field: _render(:sort_formgroup)
6
- end
7
-
8
- view :quick_filters, cache: :never do
9
- return "" unless quick_filter_list.present?
10
-
11
- haml :quick_filters, filter_list: normalized_quick_filter_list
12
- end
13
-
14
- def normalized_quick_filter_list
15
- quick_filter_list.map do |hash|
16
- quick_filter_item hash.clone, hash.keys.first
17
- end
18
- end
19
-
20
- def reset_filter_data
21
- JSON default_filter_hash
22
- end
23
-
24
- def quick_filter_item hash, filter_key
25
- {
26
- text: (hash.delete(:text) || hash[filter_key]),
27
- class: css_classes(hash.delete(:class),
28
- "_filter-link quick-filter-by-#{filter_key}"),
29
- filter: JSON(hash[:filter] || hash)
30
- }
31
- end
32
-
33
- # for override
34
- def quick_filter_list
35
- []
36
- end
37
-
38
- # for override
39
- def custom_quick_filters
40
- ""
41
- end
42
-
43
- # @param data [Hash] the filter categories. The hash needs for every category
44
- # a hash with a label and a input_field entry.
45
- def filter_form data={}, sort_input_field=nil, form_args={}
46
- haml :filter_form, categories: data,
47
- sort_input_field: sort_input_field,
48
- form_args: form_args
49
- end
50
-
51
- def filter_fields slot_selector: nil, sort_field: nil
52
- form_args = { action: filter_action_path, class: "slotter" }
53
- form_args["data-slot-selector"] = slot_selector if slot_selector
54
- filter_form filter_form_data, sort_field, form_args
55
- end
56
-
57
- def filter_form_data
58
- all_filter_keys.each_with_object({}) do |cat, h|
59
- h[cat] = { label: filter_label(cat),
60
- input_field: _render("filter_#{cat}_formgroup"),
61
- active: active_filter?(cat) }
62
- end
63
- end
64
-
65
- def active_filter? field
66
- if filter_keys_from_params.present?
67
- filter_hash.key? field
68
- else
69
- default_filter? field
70
- end
71
- end
72
-
73
- def default_filter? field
74
- default_filter_hash.key? field
75
- end
76
-
77
- def filter_label field
78
- # return "Keyword" if field.to_sym == :name
79
- #
80
- filter_label_from_method(field) || filter_label_from_name(field)
81
- end
82
-
83
- def filter_label_from_method field
84
- try "#{field}_filter_label"
85
- end
86
-
87
- def filter_label_from_name field
88
- Card.fetch_name(field) { field.to_s.sub(/^\*/, "").titleize }
89
- end
90
-
91
- def filter_action_path
92
- path
93
- end
94
-
95
- view :sort_formgroup, cache: :never do
96
- select_tag "sort",
97
- options_for_select(sort_options, current_sort),
98
- class: "pointer-select _filter-sort form-control",
99
- "data-minimum-results-for-search": "Infinity"
100
- end
101
- end
@@ -1,5 +0,0 @@
1
- ._filtered-content.nodblclick
2
- .filter-form
3
- = render_filter_form
4
- .filtered-results
5
- = render_filtered_results home_view: :filtered_results
@@ -1,105 +0,0 @@
1
- include_set Abstract::FilterHelper
2
-
3
- format :html do
4
- view :filter_name_formgroup, cache: :never do
5
- text_filter :name
6
- end
7
-
8
- def select_filter field, default=nil, options=nil
9
- options ||= filter_options field
10
- options = [["--", ""]] + options unless default
11
- select_filter_tag field, default, options
12
- end
13
-
14
- def multiselect_filter field, default=nil, options=nil
15
- options ||= filter_options field
16
- multiselect_filter_tag field, default, options
17
- end
18
-
19
- def text_filter field, default=nil, opts={}
20
- value = filter_param(field) || default
21
- text_filter_with_name_and_value filter_name(field), value, opts
22
- end
23
-
24
- def text_filter_with_name_and_value name, value, opts
25
- opts[:class] ||= "simple-text"
26
- add_class opts, "form-control"
27
- text_field_tag name, value, opts
28
- end
29
-
30
- def range_filter field, default={}, opts={}
31
- add_class opts, "simple-text range-filter-subfield"
32
- default ||= {}
33
- output [range_sign(:from),
34
- sub_text_filter(field, :from, default, opts),
35
- range_sign(:to),
36
- sub_text_filter(field, :to, default, opts)]
37
- end
38
-
39
- def range_sign side
40
- dir = side == :from ? "right" : "left"
41
- wrap_with :span, class: "input-group-prepend" do
42
- fa_icon("chevron-circle-#{dir}", class: "input-group-text")
43
- end
44
- end
45
-
46
- def sub_text_filter field, subfield, default={}, opts={}
47
- name = "filter[#{field}][#{subfield}]"
48
- value = filter_hash.dig(field, subfield) || default[subfield]
49
- text_filter_with_name_and_value name, value, opts
50
- end
51
-
52
- def autocomplete_filter type_code, options_card=nil
53
- options_card ||= Card::Name[type_code, :type, :by_name]
54
- text_filter type_code, "", class: "#{type_code}_autocomplete",
55
- "data-options-card": options_card
56
- end
57
-
58
- def multiselect_filter_tag field, default, options, html_options={}
59
- html_options[:multiple] = true
60
- select_filter_tag field, default, options, html_options
61
- end
62
-
63
- def select_filter_tag field, default, options, html_options={}
64
- name = filter_name field, html_options[:multiple]
65
- options = options_for_select options, (filter_param(field) || default)
66
- normalize_select_filter_tag_html_options field, html_options
67
- select_tag name, options, html_options
68
- end
69
-
70
- # alters html_options hash
71
- def normalize_select_filter_tag_html_options field, html_options
72
- pointer_suffix = html_options[:multiple] ? "multiselect" : "select"
73
- add_class html_options, "pointer-#{pointer_suffix} filter-input #{field} " \
74
- "_filter_input_field _no-select2 form-control"
75
- # _no-select2 because select is initiated after filter is opened.
76
- html_options[:id] = "filter-input-#{unique_id}"
77
- end
78
-
79
- def filter_name field, multi=false
80
- "filter[#{field}]#{'[]' if multi}"
81
- end
82
-
83
- def filter_options field
84
- raw = send("#{field}_options")
85
- raw.is_a?(Array) ? raw : option_hash_to_array(raw)
86
- end
87
-
88
- def option_hash_to_array hash
89
- hash.each_with_object([]) do |(key, value), array|
90
- array << [key, value.to_s]
91
- array
92
- end
93
- end
94
-
95
- def type_options type_codename, order="asc", max_length=nil
96
- Card.cache.fetch "#{type_codename}-TYPE-OPTIONS" do
97
- res = Card.search type: type_codename, return: :name, sort: "name", dir: order
98
- max_length ? (res.map { |i| [trim_option(i, max_length), i] }) : res
99
- end
100
- end
101
-
102
- def trim_option option, max_length
103
- option.size > max_length ? "#{option[0..max_length]}..." : option
104
- end
105
- end
@@ -1,38 +0,0 @@
1
- format do
2
- # all filter keys in the order they were selected
3
- def all_filter_keys
4
- @all_filter_keys ||= filter_keys_from_params | filter_keys
5
- end
6
-
7
- def filter_and_sort_cql
8
- filter_cql.merge sort_cql
9
- end
10
-
11
- def filter_cql
12
- return {} if filter_hash.empty?
13
-
14
- filter_cql_from_params
15
- end
16
-
17
- # separate method is needed for tests
18
- def filter_cql_from_params
19
- filter_class.new(filter_keys_with_values, blocked_id_cql).to_cql
20
- end
21
-
22
- def sort_cql
23
- { sort: current_sort }
24
- end
25
-
26
- def blocked_id_cql
27
- not_ids = filter_param :not_ids
28
- not_ids.present? ? { id: ["not in", not_ids.split(",")] } : {}
29
- end
30
-
31
- def current_sort
32
- sort_param || default_sort_option
33
- end
34
-
35
- def default_sort_option
36
- card.cql_content[:sort]
37
- end
38
- end
@@ -1,11 +0,0 @@
1
- .quick-filter._quick-filter
2
- %i.fa.fa-bolt.filter-section-icon
3
- .quick-filter-links.d-flex.flex-wrap
4
- - filter_list.each do |f|
5
- %a{ "data-filter": f[:filter],
6
- href: "#",
7
- class: f[:class],
8
- title: "Quick Filter: #{f[:text]}" }
9
- = f[:icon]
10
- = f[:text]
11
- = custom_quick_filters
@@ -1,2 +0,0 @@
1
- ._selectable-filtered-content{ "data-input-selector" => Env.params["input_selector"] }
2
- = render_filtered_content
@@ -1,30 +0,0 @@
1
- # include_set Abstract::Utility
2
-
3
- format do
4
- def filter_class
5
- Card::FilterQuery
6
- end
7
-
8
- def filter_keys
9
- [:name]
10
- end
11
-
12
- def filter_keys_from_params
13
- filter_hash.keys.map(&:to_sym) - [:not_ids]
14
- end
15
-
16
- def sort_options
17
- { "Alphabetical": :name, "Recently Added": :create }
18
- end
19
- end
20
-
21
- format :html do
22
- view :filtered_content, template: :haml, wrap: :slot
23
-
24
- view :filtered_results do
25
- class_up "card-slot", "_filter-result-slot"
26
- wrap { render_core }
27
- end
28
-
29
- view :selectable_filtered_content, template: :haml, cache: :never
30
- end
@@ -1,5 +0,0 @@
1
- .checkbox-list-item.w-100.d-flex
2
- .checkbox-side
3
- = check_box_tag item_card.name, item_card.key, false, class: "_checkbox-list-checkbox"
4
- .item-view-side{ style: "background: #fff" }
5
- = nest_item item_card
@@ -1,15 +0,0 @@
1
- .filter-header.card-header
2
- %h5
3
- Select Item
4
- -#.badge.badge-secondary
5
- -# = card.count
6
- .filter-selector.p-2
7
- - if card.count > 0
8
- .filter-bulk-selector.pb-3
9
- %input#select-all._select-all{name: "", type: "checkbox", value: ""}
10
- %label{for: "select-all"}
11
- select
12
- %span._unselected-items
13
- = search_with_params.size
14
- following
15
- = render :checkbox_list
@@ -1,11 +0,0 @@
1
- def cql_content
2
- { referred_to_by: "_" }
3
- end
4
-
5
- def item_cards args={}
6
- standard_item_cards args
7
- end
8
-
9
- def count
10
- item_strings.size
11
- end
@@ -1,13 +0,0 @@
1
- format :html do
2
- def filterable filter_hash={}, html_opts={}
3
- add_class html_opts, "_filterable _noFilterUrlUpdates"
4
- html_opts[:data] ||= {}
5
- html_opts[:data][:filter] = filter_hash
6
- wrap_with :div, yield, html_opts
7
- end
8
-
9
- def filtering selector=nil
10
- selector ||= "._filter-widget:visible"
11
- wrap_with :div, yield, class: "_filtering", "data-filter-selector": selector
12
- end
13
- end
@@ -1,11 +0,0 @@
1
- include_set Abstract::Filterable
2
-
3
- before :bar do
4
- class_up "bar-body", "_filterable"
5
- super()
6
- end
7
-
8
- before :expanded_bar do
9
- class_up "bar", "_filterable"
10
- super()
11
- end
data/set/right/follow.rb DELETED
@@ -1,3 +0,0 @@
1
- def raw_help_text
2
- "Get notified about changes"
3
- end