card-mod-search 0.14.2 → 0.15.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -0
  3. data/assets/script/autocomplete.js.coffee +36 -0
  4. data/assets/script/search_box.js.coffee +25 -0
  5. data/assets/style/search.scss +69 -0
  6. data/config/locales/de.yml +4 -0
  7. data/config/locales/en.yml +4 -0
  8. data/data/files/mod_search_script_asset_output/file.js +4 -0
  9. data/data/real.yml +112 -0
  10. data/data/test.yml +18 -0
  11. data/lib/card/mod/search.rb +4 -0
  12. data/set/abstract/0_search/checkbox_item.haml +6 -0
  13. data/set/abstract/{02_search_params.rb → 0_search/search_params.rb} +2 -4
  14. data/set/abstract/{05_search → 0_search}/views.rb +23 -46
  15. data/set/abstract/{05_search.rb → 0_search.rb} +9 -9
  16. data/set/abstract/{06_cql_search.rb → cql_search.rb} +3 -6
  17. data/set/abstract/search_views.rb +1 -2
  18. data/set/abstract/virtual_search.rb +3 -0
  19. data/set/all/autocomplete/autocomplete_input.haml +3 -0
  20. data/set/all/autocomplete/autocomplete_item.haml +5 -0
  21. data/set/all/autocomplete.rb +48 -0
  22. data/set/right/by_create.rb +7 -0
  23. data/set/right/by_name.rb +7 -0
  24. data/set/right/by_update.rb +7 -0
  25. data/set/right/children.rb +8 -0
  26. data/set/right/count.rb +9 -0
  27. data/set/right/created.rb +8 -0
  28. data/set/right/creator.rb +7 -0
  29. data/set/right/edited.rb +8 -0
  30. data/set/right/editors.rb +8 -0
  31. data/set/right/last_edited.rb +7 -0
  32. data/set/right/linked_to_by.rb +8 -0
  33. data/set/right/links_to.rb +7 -1
  34. data/set/right/mates.rb +9 -1
  35. data/set/right/nested_by.rb +9 -1
  36. data/set/right/nests.rb +8 -0
  37. data/set/right/referred_to_by.rb +8 -0
  38. data/set/right/refers_to.rb +8 -0
  39. data/set/self/recent.rb +38 -4
  40. data/set/self/search/results_for_keyword.haml +5 -0
  41. data/set/self/search/search_box.haml +2 -0
  42. data/set/self/search.rb +88 -40
  43. data/set/type/cardtype.rb +12 -1
  44. metadata +63 -28
  45. data/lib/card/filter_query.rb +0 -78
  46. data/set/abstract/00_filter_helper.rb +0 -46
  47. data/set/abstract/03_filter/_filter_input.haml +0 -8
  48. data/set/abstract/03_filter/filter_form.haml +0 -56
  49. data/set/abstract/03_filter/filter_form.rb +0 -101
  50. data/set/abstract/03_filter/filtered_content.haml +0 -5
  51. data/set/abstract/03_filter/form_helper.rb +0 -105
  52. data/set/abstract/03_filter/query_construction.rb +0 -38
  53. data/set/abstract/03_filter/quick_filters.haml +0 -11
  54. data/set/abstract/03_filter/selectable_filtered_content.haml +0 -2
  55. data/set/abstract/03_filter.rb +0 -30
  56. data/set/abstract/05_search/checkbox_item.haml +0 -5
  57. data/set/abstract/05_search/select_item.haml +0 -15
  58. data/set/abstract/filter_list.rb +0 -11
  59. data/set/abstract/filterable.rb +0 -13
  60. data/set/abstract/filterable_bar.rb +0 -11
  61. data/set/right/follow.rb +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 206b17cbcd8dcd1d38acb8228deeda153fedd37e39846becd85e3c86272a52ee
4
- data.tar.gz: a0e71ded665f407737832dae8fa8e7292a25339f0c990df9c5abaeb5b10ef5da
3
+ metadata.gz: b008892d84099ca72467e23c9513d17e35bbd9beec7a8cd382bf389da67a4447
4
+ data.tar.gz: ed4cdb318be0ab29ab5e072e6831e622c3affca32eb624e3ce0de7e44581b986
5
5
  SHA512:
6
- metadata.gz: 0de1b034548fa4c6e523a848e521b1a0d5f0039d78252960adcfcfc55508877dac5313f12edecf5bef51fa08e429535d266363ccf461d25575b837d3176c909f
7
- data.tar.gz: 1b8e708a4ebfc81c1613f52b92853298473780343cb689ebb200f13f336b39e5e95fce7be7bba1fe494d2a6a0dc0dd2c125cc9f82eb0e515dbfd42950e04d35b
6
+ metadata.gz: 3d5c0967389b56328ef7a2bcd3fc3e0bc71d3fa8340d098cb11233f87228d86c321ebe1c34eaa32e544d8f2591a0a595d1a327fb7deba6a7642d7ada0737aae7
7
+ data.tar.gz: 2956a04a96dd9851e6185de5a99efd942ddde353776c23567af8523b9815af9c58bfbe029d146fe8649e128df69c2cd73a88ab737412b189afb2f22571575c4a
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ <!--
2
+ # @title README - mod: search
3
+ -->
4
+ # Search mod
@@ -0,0 +1,36 @@
1
+ decko.slot.ready (slot) ->
2
+ slot.find('._autocomplete').each (_i) ->
3
+ decko.initAutoCardPlete($(this))
4
+
5
+ slot.find('._select2autocomplete').each (_i) ->
6
+ decko.select2Autocomplete.init $(this)
7
+
8
+ decko.initAutoCardPlete = (input) ->
9
+ optionsCard = input.data 'options-card'
10
+ return unless !!optionsCard
11
+ path = optionsCard + '.json?view=name_match'
12
+ input.autocomplete { source: decko.slot.path(path) }
13
+
14
+ decko.select2Autocomplete =
15
+ init: (el, options, ajaxOptions) ->
16
+ opts = $.extend {}, @_defaults(el), options
17
+ $.extend opts.ajax, ajaxOptions if ajaxOptions
18
+ el.select2 opts
19
+
20
+ _defaults: (el)->
21
+ multiple: false
22
+ width: "100%!important"
23
+ minimumInputLength: 0
24
+ maximumSelectionSize: 1
25
+
26
+ placeholder: el.attr("placeholder")
27
+ escapeMarkup: (markup) -> markup
28
+
29
+ ajax:
30
+ delay: 200
31
+ cache: true
32
+ url: decko.path ':search.json'
33
+ processResults: (data) -> results: data
34
+ data: (params) ->
35
+ query: { keyword: params.term }
36
+ view: "complete"
@@ -0,0 +1,25 @@
1
+
2
+ $(window).ready ->
3
+ el = $('._search-box')
4
+ box = new decko.searchBox el
5
+ el.data "searchBox", box
6
+ box.init()
7
+
8
+ class decko.searchBox
9
+ constructor: (el) ->
10
+ @box = el
11
+ @sourcepath = @box.data "completepath"
12
+ @originalpath = @sourcepath
13
+ @config =
14
+ source: @sourcepath
15
+ select: @select
16
+
17
+ init: -> @box.autocomplete @config, html: true
18
+
19
+ select: (_event, ui) ->
20
+ url = ui.item.url
21
+ window.location = url if url
22
+
23
+ form: -> @box.closest "form"
24
+ keyword: -> @keywordBox().val()
25
+ keywordBox: -> @form().find "#query_keyword"
@@ -0,0 +1,69 @@
1
+
2
+ .d0-search-box {
3
+ width: 100%;
4
+ }
5
+
6
+ .search-keyword {
7
+ font-style: italic;
8
+ }
9
+
10
+ .search-count {
11
+ float: right;
12
+ color: $gray-600;
13
+ }
14
+
15
+ .closed-content .search-no-results:after {
16
+ content:'';
17
+ }
18
+
19
+ /* english content in css. ugh */
20
+ .search-no-results:after {
21
+ content:'0 results';
22
+ }
23
+
24
+ .search-box-nav {
25
+ flex: 1 0 50%;
26
+ .search-box-form {
27
+ width: 100%;
28
+ }
29
+ .select2-results > .select2-results__options {
30
+ max-height: none !important;
31
+ }
32
+ .select2-search__field {
33
+ width: 100% !important;
34
+ }
35
+ }
36
+
37
+ .search-box-item-label {
38
+ float: left;
39
+ position: relative;
40
+ font-size: 10px;
41
+ width: 50px;
42
+ padding: 3px 0 3px 5px;
43
+ }
44
+ .search-box-item-value mark {
45
+ padding: 0.2em 0;
46
+ }
47
+
48
+ .ui-autocomplete {
49
+ z-index: 2000 !important; // to move it in front of modals (= 1050)
50
+ .ui-menu-item-wrapper {
51
+ display: block;
52
+ }
53
+ }
54
+
55
+ .autocomplete-item {
56
+ display: flex;
57
+ margin: 0.4em 0;
58
+ .autocomplete-icon {
59
+ width: 30px;
60
+ margin-right: 1em;
61
+ text-align: center;
62
+ img, svg {
63
+ max-width: 100% !important;
64
+ max-height: 100% !important;
65
+ min-width: auto !important;
66
+ min-height: auto !important;
67
+ }
68
+ }
69
+ }
@@ -0,0 +1,4 @@
1
+ de:
2
+ search_search_box_placeholder: Suche
3
+ search_results_title: Suchergebnisse
4
+ search_results_for: Ergebnisse für
@@ -0,0 +1,4 @@
1
+ en:
2
+ search_search_box_placeholder: Search
3
+ search_results_title: Search Results
4
+ search_results_for: Results for
@@ -0,0 +1,4 @@
1
+ // autocomplete.js.coffee
2
+ (function(){decko.slot.ready(function(e){return e.find("._autocomplete").each(function(){return decko.initAutoCardPlete($(this))}),e.find("._select2autocomplete").each(function(){return decko.select2Autocomplete.init($(this))})}),decko.initAutoCardPlete=function(e){var t,n;if(t=e.data("options-card"))return n=t+".json?view=name_match",e.autocomplete({source:decko.slot.path(n)})},decko.select2Autocomplete={init:function(e,t,n){var o;return o=$.extend({},this._defaults(e),t),n&&$.extend(o.ajax,n),e.select2(o)},_defaults:function(e){return{multiple:!1,width:"100%!important",minimumInputLength:0,maximumSelectionSize:1,placeholder:e.attr("placeholder"),escapeMarkup:function(e){return e},ajax:{delay:200,cache:!0,url:decko.path(":search.json"),processResults:function(e){return{results:e}},data:function(e){return{query:{keyword:e.term},view:"complete"}}}}}}}).call(this);
3
+ // search_box.js.coffee
4
+ (function(){$(window).ready(function(){var t,o;return o=$("._search-box"),t=new decko.searchBox(o),o.data("searchBox",t),t.init()}),decko.searchBox=function(){function t(t){this.box=t,this.sourcepath=this.box.data("completepath"),this.originalpath=this.sourcepath,this.config={source:this.sourcepath,select:this.select}}return t.prototype.init=function(){return this.box.autocomplete(this.config,{html:!0})},t.prototype.select=function(t,o){var e;if(e=o.item.url)return window.location=e},t.prototype.form=function(){return this.box.closest("form")},t.prototype.keyword=function(){return this.keywordBox().val()},t.prototype.keywordBox=function(){return this.form().find("#query_keyword")},t}()}).call(this);
data/data/real.yml ADDED
@@ -0,0 +1,112 @@
1
+ ---
2
+ - :name: Search
3
+ :type: :cardtype
4
+ :codename: search_type
5
+ :fields:
6
+ :description: |-
7
+ <p>
8
+ Searches return a list of cards using
9
+ [[http://decko.org/CQL|CQL, the Card Query Language]].
10
+ See the [[http://decko.org/CQL_syntax|syntax documentation]].
11
+ </p>
12
+
13
+ - :name: "*search"
14
+ :type: :search_type
15
+ :codename: search
16
+ :content: '{"match":"$keyword", "sort":"relevance"}'
17
+ - :name: "*recent"
18
+ :type: :search_type
19
+ :codename: recent
20
+ :fields:
21
+ :self:
22
+ :fields:
23
+ :read: Anyone
24
+ - :name: "*count"
25
+ :codename: count
26
+
27
+ - :name: by name
28
+ :codename: by_name
29
+ - :name: by create
30
+ :codename: by_create
31
+ - :name: by update
32
+ :codename: by_update
33
+
34
+ - :name: "*last edited"
35
+ :codename: last_edited
36
+ - :name: "*creator"
37
+ :codename: creator
38
+ - :name: "*created"
39
+ :codename: created
40
+ :fields:
41
+ :right:
42
+ :fields:
43
+ :help: Cards created by <em>{{_left|name}}</em>.
44
+ - :name: "*edited"
45
+ :codename: edited
46
+ :fields:
47
+ :right:
48
+ :fields:
49
+ :help: Cards edited by <em>{{_left|name}}</em>.
50
+ - :name: "*editors"
51
+ :codename: editors
52
+ :fields:
53
+ :right:
54
+ :fields:
55
+ :help: Users who have edited <em>{{_left|name}}</em>.
56
+
57
+ - :name: "*children"
58
+ :codename: children
59
+ :fields:
60
+ :right:
61
+ :fields:
62
+ :help: |-
63
+ <p>
64
+ Cards formed by "mating" <em>{{_left|name}}</em> with another card.
65
+ eg\: "{{_left|name}}<strong>+</strong>mate".
66
+ </p>
67
+ - :name: "*mates"
68
+ :codename: mates
69
+ :fields:
70
+ :right:
71
+ :fields:
72
+ :help: |-
73
+ <p>
74
+ If there is a card named "X+<em>{{_left|name}}</em>",
75
+ then X is a mate of <em>{{_left|name}}</em>.
76
+ </p>
77
+ - :name: "*nested by"
78
+ :codename: nested_by
79
+ :fields:
80
+ :right:
81
+ :fields:
82
+ :help: "<p>Cards that refer to <em>{{_left|name}}</em>.</p>"
83
+ - :name: "*linked to by"
84
+ :codename: linked_to_by
85
+ :fields:
86
+ :right:
87
+ :fields:
88
+ :help: "<p>Cards that link to <em>{{_left|name}}</em>.</p>"
89
+ - :name: "*nests"
90
+ :codename: nests
91
+ :fields:
92
+ :right:
93
+ :fields:
94
+ :help: "<p>Cards nested within <em>{{_left|name}}</em></p>"
95
+ - :name: "*links to"
96
+ :codename: links_to
97
+ :fields:
98
+ :right:
99
+ :fields:
100
+ :help: "<p>Cards that <em>{{_left|name}}</em> links to.</p>"
101
+ - :name: "*referred to by"
102
+ :codename: referred_to_by
103
+ :fields:
104
+ :right:
105
+ :fields:
106
+ :help: "<p>Cards referred to by <em>{{_left|name}}</em>.</p>"
107
+ - :name: "*refers to"
108
+ :codename: refers_to
109
+ :fields:
110
+ :right:
111
+ :fields:
112
+ :help: "<p>Cards that <em>{{_left|name}}</em> refers to.</p>"
data/data/test.yml ADDED
@@ -0,0 +1,18 @@
1
+ ---
2
+ - :name: '42'
3
+ :content: |
4
+ Far out in the uncharted backwaters of the unfashionable end of
5
+ the western spiral arm of the Galaxy lies a small unregarded
6
+ yellow sun.
7
+
8
+ Orbiting this at a distance of roughly ninety-two million miles
9
+ is an utterly insignificant little blue green planet whose ape-
10
+ descended life forms are so amazingly primitive that they still
11
+ think digital watches are a pretty neat idea.
12
+
13
+ This planet has - or rather had - a problem, which was this: most
14
+ of the people living on it were unhappy for pretty much of the time.
15
+ Many solutions were suggested for this problem, but most of these
16
+ were largely concerned with the movements of small green pieces
17
+ of paper, which is odd because on the whole it wasn't the small
18
+ green pieces of paper that were unhappy.
@@ -0,0 +1,4 @@
1
+ Cardio::Railtie.config.tap do |config|
2
+ config.paging_limit = 20
3
+ config.search_box_match_start_only = true
4
+ end
@@ -0,0 +1,6 @@
1
+ //- id = "#{card.key}-_-#{item_card.key}"
2
+ .w-100.d-flex.align-items-center
3
+ = check_box_tag item_card.name, item_card.key, false,
4
+ class: "_checkbox-list-checkbox p-1 me-3"
5
+ %label.p-2.w-100
6
+ = nest_item item_card
@@ -5,7 +5,7 @@ format do
5
5
 
6
6
  # used for override
7
7
  def default_search_params
8
- if (qparams = query_params)
8
+ if (qparams = query_params)&.present?
9
9
  paging_params.merge vars: qparams
10
10
  else
11
11
  paging_params
@@ -17,9 +17,7 @@ format do
17
17
  end
18
18
 
19
19
  def query_params
20
- return nil unless (vars = params[:query])
21
-
22
- Env.hash vars
20
+ (vars = params[:query]) ? Env.hash(vars) : {}
23
21
  end
24
22
 
25
23
  def default_limit
@@ -4,8 +4,7 @@ format do
4
4
  end
5
5
 
6
6
  view :search_error, cache: :never do
7
- sr_class = search_with_params.class.to_s
8
- %(#{sr_class} :: #{search_with_params.message} :: #{card.content})
7
+ %(#{search_with_params.class} :: #{search_with_params.message} :: #{card.content})
9
8
  end
10
9
 
11
10
  view :card_list, cache: :never do
@@ -25,15 +24,19 @@ format do
25
24
  def with_results
26
25
  search_with_params.empty? ? render_no_search_results : yield
27
26
  end
28
- end
29
-
30
- format :json do
31
- AUTOCOMPLETE_LIMIT = 8 # number of name suggestions for autocomplete text fields
32
27
 
33
28
  def item_cards
34
29
  search_with_params
35
30
  end
36
31
 
32
+ def term_param
33
+ params[:term]
34
+ end
35
+ end
36
+
37
+ format :json do
38
+ AUTOCOMPLETE_LIMIT = 8 # number of name suggestions for autocomplete text fields
39
+
37
40
  # NOCACHE because paging_urls is uncacheable hash and thus not safe to merge
38
41
  view :molecule, cache: :never do
39
42
  molecule.merge render_paging_urls
@@ -48,30 +51,32 @@ format :json do
48
51
  complete_or_match_search limit: AUTOCOMPLETE_LIMIT
49
52
  end
50
53
 
51
- def complete_or_match_search limit: AUTOCOMPLETE_LIMIT, start_only: false
52
- starts_with = complete_search limit: limit
54
+ def complete_or_match_search limit: AUTOCOMPLETE_LIMIT, start_only: false,
55
+ additional_cql: {}
56
+ starts_with = complete_search limit: limit, additional_cql: additional_cql
53
57
  return starts_with if start_only
54
58
 
55
59
  remaining_slots = limit - starts_with.size
56
60
  return starts_with if remaining_slots.zero?
57
61
 
58
- starts_with + match_search(not_names: starts_with, limit: remaining_slots)
62
+ starts_with + match_search(not_names: starts_with, limit: remaining_slots,
63
+ additional_cql: additional_cql)
59
64
  end
60
65
 
61
- def complete_search limit: AUTOCOMPLETE_LIMIT
62
- card.search name_cql(limit).merge(complete_cql)
66
+ def complete_search limit: AUTOCOMPLETE_LIMIT, additional_cql: {}
67
+ card.search name_cql(limit).merge(complete_cql).merge(additional_cql)
63
68
  end
64
69
 
65
- def match_search limit: AUTOCOMPLETE_LIMIT, not_names: []
66
- card.search name_cql(limit).merge(match_cql(not_names))
70
+ def match_search limit: AUTOCOMPLETE_LIMIT, not_names: [], additional_cql: {}
71
+ card.search name_cql(limit).merge(match_cql(not_names)).merge(additional_cql)
67
72
  end
68
73
 
69
74
  def name_cql limit
70
- { limit: limit, sort: "name", return: "name" }
75
+ { limit: limit, sort_by: "name", return: "name" }
71
76
  end
72
77
 
73
78
  def complete_cql
74
- { complete: term_param }
79
+ term_param.present? ? { complete: term_param } : {}
75
80
  end
76
81
 
77
82
  def match_cql not_names
@@ -79,10 +84,6 @@ format :json do
79
84
  cql[:name] = ["not in"] + not_names if not_names.any?
80
85
  cql
81
86
  end
82
-
83
- def term_param
84
- params[:term]
85
- end
86
87
  end
87
88
 
88
89
  format :data do
@@ -95,39 +96,19 @@ end
95
96
 
96
97
  format :csv do
97
98
  view :core, :core, mod: All::Csv::CsvFormat
98
-
99
- view :card_list do
100
- items = super()
101
- if depth.zero?
102
- title_row + items
103
- else
104
- items
105
- end
106
- end
107
99
  end
108
100
 
109
101
  format :html do
110
102
  view :card_list, cache: :never do
111
103
  with_results do
112
- search_result_list "search-result-list" do |item_card|
113
- card_list_item item_card
114
- end
104
+ klasses = "card-list card-list-#{item_view_options[:view]} search-result-list"
105
+ search_result_list(klasses) { |item_card| card_list_item item_card }
115
106
  end
116
107
  end
117
108
 
118
- view :select_item, cache: :never do
119
- wrap do
120
- haml :select_item
121
- end
122
- end
123
-
124
- before :select_item do
125
- class_up "card-slot", "_filter-result-slot"
126
- end
127
-
128
109
  view :checkbox_list, cache: :never do
129
110
  with_results do
130
- search_result_list "_search-checkbox-list pr-2" do |item_card|
111
+ search_result_list "_search-checkbox-list pe-2" do |item_card|
131
112
  checkbox_item item_card
132
113
  end
133
114
  end
@@ -158,8 +139,4 @@ format :html do
158
139
  haml :checkbox_item, unique_id: unique_id, item_card: item_card
159
140
  end
160
141
  end
161
-
162
- def closed_limit
163
- [search_params[:limit].to_i, Card.config.closed_search_limit].min
164
- end
165
142
  end
@@ -1,6 +1,4 @@
1
1
  include_set Abstract::Paging
2
- include_set Abstract::SearchParams
3
- include_set Abstract::Filter
4
2
 
5
3
  def search _args={}
6
4
  raise Error, "search not overridden"
@@ -38,9 +36,9 @@ def count args={}
38
36
  end
39
37
 
40
38
  # for override
41
- def item_type
42
- nil
43
- end
39
+ # def item_type_id
40
+ # nil
41
+ # end
44
42
 
45
43
  def each_item_name_with_options _content=nil
46
44
  options = {}
@@ -52,6 +50,8 @@ def each_item_name_with_options _content=nil
52
50
  end
53
51
 
54
52
  format do
53
+ view(:count, cache: :never) { super() }
54
+
55
55
  def search_with_params
56
56
  @search_with_params ||= search_with_rescue search_params
57
57
  end
@@ -60,10 +60,6 @@ format do
60
60
  @count_with_params ||= search_with_rescue search_params.merge(return: :count)
61
61
  end
62
62
 
63
- view :filtered_count, cache: :never do
64
- count_with_params
65
- end
66
-
67
63
  def search_with_rescue query_args
68
64
  rescuing_bad_query query_args do
69
65
  card.cached_search query_args
@@ -82,3 +78,7 @@ format do
82
78
  Card::View.normalize view
83
79
  end
84
80
  end
81
+
82
+ format :html do
83
+ view(:count, cache: :never) { super() }
84
+ end
@@ -11,9 +11,10 @@ def cql_content
11
11
  query.symbolize_keys
12
12
  end
13
13
 
14
- def item_type
14
+ def item_type_id
15
15
  type = cql_hash[:type]
16
- type unless type.is_a?(Array) || type.is_a?(Hash)
16
+ type = type&.card_id unless type.is_a? Hash
17
+ type if type.is_a? Integer
17
18
  end
18
19
 
19
20
  # for override, eg when required subqueries are known to be missing
@@ -71,10 +72,6 @@ def standardized_query_args args
71
72
  end
72
73
 
73
74
  format do
74
- def search_params
75
- super.merge filter_and_sort_cql
76
- end
77
-
78
75
  def default_limit
79
76
  card_content_limit || super
80
77
  end
@@ -41,8 +41,7 @@ format :html do
41
41
  if depth > max_depth
42
42
  "..."
43
43
  else
44
- search_params[:limit] = closed_limit
45
- _render_core hide: "paging", items: { view: :link }
44
+ render_core hide: "paging", items: { view: :link }
46
45
  # TODO: if item is queryified to be "name", then that should work.
47
46
  # otherwise use link
48
47
  end
@@ -0,0 +1,3 @@
1
+ def virtual?
2
+ new?
3
+ end
@@ -0,0 +1,3 @@
1
+ .pointer-list-editor.pointer-list-ul
2
+ = text_field_tag 'pointer_item', item, class: "pointer-item-text form-control _autocomplete #{extra_classes}",
3
+ "data-options-card": options_card
@@ -0,0 +1,5 @@
1
+ .autocomplete-item{ class: "autocomplete-item-#{type}" }
2
+ .autocomplete-icon
3
+ = icon
4
+ .autocomplete-label
5
+ = label
@@ -0,0 +1,48 @@
1
+ def add_autocomplete_ok?
2
+ new_card? && name.valid? && !virtual? && ok?(:create)
3
+ end
4
+
5
+ format :html do
6
+ view :goto_autocomplete_item do
7
+ autocomplete_item :goto, goto_autocomplete_icon, autocomplete_label
8
+ end
9
+
10
+ view :add_autocomplete_item, unknown: true do
11
+ autocomplete_item :add, icon_tag(:add), autocomplete_label
12
+ end
13
+
14
+ def autocomplete_field item, options_card_name, extra_classes=""
15
+ haml :autocomplete_input,
16
+ item: item, options_card: options_card_name,
17
+ extra_classes: extra_classes
18
+ end
19
+
20
+ def name_autocomplete_field item, extra_classes=""
21
+ # select_tag "autocomplete_#{card.key}", "", class: "_select2autocomplete"
22
+ text_field_tag "pointer_item", item,
23
+ class: "pointer-item-text form-control _autocomplete #{extra_classes}",
24
+ "data-options-card": %i[all by_name].to_name
25
+ end
26
+
27
+ def add_autocomplete_item_path
28
+ path
29
+ end
30
+
31
+ private
32
+
33
+ def autocomplete_item type, icon, label
34
+ haml :autocomplete_item, type: type, icon: icon, label: label
35
+ end
36
+
37
+ def goto_autocomplete_icon
38
+ if card.fetch :image
39
+ field_nest :image, view: :core, size: :small
40
+ else
41
+ icon_tag :arrow_forward
42
+ end
43
+ end
44
+
45
+ def autocomplete_label
46
+ card.name
47
+ end
48
+ end
@@ -0,0 +1,7 @@
1
+ include_set Abstract::VirtualSearch
2
+
3
+ assign_type :search_type
4
+
5
+ def cql_content
6
+ { found_by: "_left", sort_by: "create" }
7
+ end
@@ -0,0 +1,7 @@
1
+ include_set Abstract::VirtualSearch
2
+
3
+ assign_type :search_type
4
+
5
+ def cql_content
6
+ { found_by: "_left", sort_by: "name" }
7
+ end
@@ -0,0 +1,7 @@
1
+ include_set Abstract::VirtualSearch
2
+
3
+ assign_type :search_type
4
+
5
+ def cql_content
6
+ { "found_by": "_left", sort_by: "update" }
7
+ end
@@ -1,3 +1,11 @@
1
+ include_set Abstract::VirtualSearch
2
+
3
+ assign_type :search_type
4
+
5
+ def cql_content
6
+ { part: "_left", sort_by: "name" }
7
+ end
8
+
1
9
  def raw_help_text
2
10
  "Cards formed by \"mating\" {{_left|name}} with another card. "\
3
11
  "eg: \"{{_left|name}}+mate\"."
@@ -0,0 +1,9 @@
1
+ assign_type :search_type
2
+
3
+ def virtual?
4
+ new?
5
+ end
6
+
7
+ def cql_content
8
+ { found_by: "_left", return: "count" }
9
+ end
data/set/right/created.rb CHANGED
@@ -1,3 +1,11 @@
1
+ include_set Abstract::VirtualSearch
2
+
3
+ assign_type :search_type
4
+
5
+ def cql_content
6
+ { created_by: "_left", sort_by: "create", dir: "desc" }
7
+ end
8
+
1
9
  def raw_help_text
2
10
  "Cards created by {{_left|name}}."
3
11
  end