card 1.15.6 → 1.15.7
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/VERSION +1 -1
- data/mod/01_core/chunk/link.rb +6 -5
- data/mod/01_core/set/all/collection.rb +51 -24
- data/mod/01_core/spec/set/all/collection_spec.rb +40 -3
- data/mod/05_standard/set/type/search_type.rb +15 -0
- data/mod/05_standard/spec/set/type/search_type_spec.rb +8 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6b60af27233d8dff99d74a78a0a2af92e3d4678
|
4
|
+
data.tar.gz: 6b8cd33ddbc834023b0d61c9612440cb43a683be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da1d81537ed7136d0e230240b43766bc1afe5d797e4fdb1901053ac4b512985b79cd842cf2e7a51706818db00e27e35e728d240c6fa1d771ee5347a801babf8a
|
7
|
+
data.tar.gz: 0a476b7978c770089694190eb831e41d9195c2e9812ddb74fd54a7a433c43e4aa056438f7ecc8b1f6170fae42d356fdf215d5bed52c553b3410a10807b46fa38
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.15.
|
1
|
+
1.15.7
|
data/mod/01_core/chunk/link.rb
CHANGED
@@ -4,6 +4,7 @@ require_dependency File.expand_path( '../reference', __FILE__ )
|
|
4
4
|
|
5
5
|
module Card::Chunk
|
6
6
|
class Link < Reference
|
7
|
+
attr_reader :link_text
|
7
8
|
word = /\s*([^\]\|]+)\s*/
|
8
9
|
# Groups: $1, [$2]: [[$1]] or [[$1|$2]] or $3, $4: [$3][$4]
|
9
10
|
Card::Chunk.register_class self, {
|
@@ -20,18 +21,18 @@ module Card::Chunk
|
|
20
21
|
[ raw_syntax, nil ]
|
21
22
|
end
|
22
23
|
end
|
23
|
-
|
24
|
+
|
24
25
|
@link_text = objectify @link_text
|
25
26
|
if target =~ /\/|mailto:/
|
26
27
|
@explicit_link = objectify target
|
27
28
|
else
|
28
29
|
@name = target
|
29
|
-
end
|
30
|
+
end
|
30
31
|
end
|
31
32
|
|
32
33
|
def divider_index string
|
33
34
|
#there's probably a better way to do the following. point is to find the first pipe that's not inside an inclusion
|
34
|
-
|
35
|
+
|
35
36
|
if string.index '|'
|
36
37
|
string_copy = "#{string}" # had to do this to create new string?!
|
37
38
|
string.scan /\{\{[^\}]*\}\}/ do |incl|
|
@@ -55,7 +56,7 @@ module Card::Chunk
|
|
55
56
|
|
56
57
|
def render_link
|
57
58
|
@link_text = render_obj @link_text
|
58
|
-
|
59
|
+
|
59
60
|
if @explicit_link
|
60
61
|
@explicit_link = render_obj @explicit_link
|
61
62
|
format.web_link @explicit_link, :text=> @link_text
|
@@ -80,7 +81,7 @@ module Card::Chunk
|
|
80
81
|
else
|
81
82
|
@link_text = new_name if old_name.to_name == @link_text
|
82
83
|
end
|
83
|
-
|
84
|
+
|
84
85
|
@text = @link_text.nil? ? "[[#{referee_name.to_s}]]" : "[[#{referee_name.to_s}|#{@link_text}]]"
|
85
86
|
end
|
86
87
|
end
|
@@ -175,38 +175,55 @@ format do
|
|
175
175
|
end
|
176
176
|
end
|
177
177
|
end
|
178
|
+
|
179
|
+
|
180
|
+
def each_nest args={}
|
181
|
+
Card::Content.new(card.content, card).find_chunks( Card::Chunk::Reference ).each do |chunk|
|
182
|
+
yield(chunk.referee_name.to_s, nest_args(args,chunk))
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def map_nests args={}, &block
|
187
|
+
result = []
|
188
|
+
each_nest args do |name, n_args|
|
189
|
+
result << block.call(name, n_args)
|
190
|
+
end
|
191
|
+
result
|
192
|
+
end
|
193
|
+
|
194
|
+
# process args for links and nests
|
195
|
+
def nest_args args, chunk=nil
|
196
|
+
r_args = item_args(args)
|
197
|
+
if @inclusion_opts
|
198
|
+
r_args.merge! @inclusion_opts.clone
|
199
|
+
end
|
200
|
+
if chunk.kind_of? Card::Chunk::Include
|
201
|
+
r_args.merge!(chunk.options)
|
202
|
+
elsif chunk.kind_of? Card::Chunk::Link
|
203
|
+
r_args.reverse_merge!(:view=>:link)
|
204
|
+
r_args.reverse_merge!(:title=>chunk.link_text) if chunk.link_text
|
205
|
+
end
|
206
|
+
r_args
|
207
|
+
end
|
208
|
+
|
178
209
|
end
|
179
210
|
|
211
|
+
|
180
212
|
format :html do
|
181
213
|
view :tabs do |args|
|
182
214
|
tab_buttons = ''
|
183
215
|
tab_panes = ''
|
184
|
-
|
185
|
-
|
186
|
-
id
|
187
|
-
|
188
|
-
|
189
|
-
slot_args = @inclusion_opts.clone
|
190
|
-
slot_args.delete(:view)
|
191
|
-
if item.kind_of? Card::Chunk::Include
|
192
|
-
slot_args.merge!(item.options)
|
193
|
-
end
|
194
|
-
i_args.merge!(:slot=>slot_args)
|
195
|
-
end
|
196
|
-
url = page_path(item.referee_name, i_args)
|
197
|
-
tab_name = (item.respond_to?(:options) && item.options[:title]) || item.name
|
216
|
+
active_tab = true
|
217
|
+
each_nest(:item=>:content) do |name, nest_args|
|
218
|
+
id = "#{card.cardname.safe_key}-#{name.to_name.safe_key}"
|
219
|
+
url = nest_path name, nest_args
|
220
|
+
tab_name = nest_args[:title] || name
|
198
221
|
tab_buttons += tab_button( "##{id}", tab_name, active_tab, 'data-url'=>url.html_safe, :class=>(active_tab ? nil : 'load'))
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
item.process_chunk { |options| prepare_nest options }
|
203
|
-
else
|
204
|
-
nest(Card.fetch(item, :new=>{}), i_args)
|
205
|
-
end
|
206
|
-
else
|
207
|
-
''
|
208
|
-
end
|
222
|
+
|
223
|
+
# only render the first active tab, other tabs get loaded via ajax
|
224
|
+
tab_content = active_tab ? nest(Card.fetch(name, :new=>{}), nest_args) : ''
|
209
225
|
tab_panes += tab_pane( id, tab_content, active_tab )
|
226
|
+
active_tab = false
|
210
227
|
end
|
211
228
|
tab_panel tab_buttons, tab_panes, args[:tab_type]
|
212
229
|
end
|
@@ -214,6 +231,16 @@ format :html do
|
|
214
231
|
args[:tab_type] ||= 'tabs'
|
215
232
|
end
|
216
233
|
|
234
|
+
|
235
|
+
# create a path for a nest with respect ot the inclusion options
|
236
|
+
def nest_path name, nest_args
|
237
|
+
path_args = {}
|
238
|
+
path_args[:view] = nest_args[:view]
|
239
|
+
path_args[:slot] = nest_args.clone
|
240
|
+
path_args[:slot].delete(:view)
|
241
|
+
page_path(name, path_args)
|
242
|
+
end
|
243
|
+
|
217
244
|
view :pills, :view=>:tabs
|
218
245
|
def default_pills_args args
|
219
246
|
args[:tab_type] ||= 'pills'
|
@@ -63,23 +63,52 @@ describe Card::Set::All::Collection do
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
+
describe '#map_nests' do
|
67
|
+
before do
|
68
|
+
Card::Auth.as_bot do
|
69
|
+
@list = Card.create! :name=>'mixed list', :content=>"[[A]]\n{{B}}\n[[C|link C]]\n{{D|name;title:nest D}}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
it 'handles links and nest arguments' do
|
73
|
+
result = @list.format.map_nests do |name,args|
|
74
|
+
[name, args]
|
75
|
+
end
|
76
|
+
expect(result).to eq [
|
77
|
+
['A', {:view=>:closed}],
|
78
|
+
['B', {:view=>:closed, :inc_name=>"B", :inc_syntax=>"B"}],
|
79
|
+
['C', {:view=>:closed, :title=>'link C'}],
|
80
|
+
['D', {:view=>"name", :title=>"nest D", :inc_name=>"D", :inc_syntax=>"D|name;title:nest D"}]
|
81
|
+
]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
66
85
|
describe 'tabs view' do
|
67
86
|
it 'renders tab panel' do
|
68
|
-
tabs = render_card :tabs, :content=>"[[A]]\n[[B]]\n[C]", :type=>'pointer'
|
87
|
+
tabs = render_card :tabs, :content=>"[[A]]\n[[B]]\n[[C]]", :type=>'pointer'
|
69
88
|
assert_view_select tabs, 'div[role=tabpanel]' do
|
70
89
|
assert_select 'li > a[data-toggle=tab]'
|
71
90
|
end
|
72
91
|
end
|
73
92
|
|
74
93
|
it 'loads only the first tab pane' do
|
75
|
-
tabs = render_card :tabs, :content=>"[[A]]\n[[B]]\n[C]", :type=>'pointer'
|
94
|
+
tabs = render_card :tabs, :content=>"[[A]]\n[[B]]\n[[C]]", :type=>'pointer'
|
76
95
|
assert_view_select tabs, 'div[role=tabpanel]' do
|
77
|
-
assert_select 'div.tab-pane#tempo_rary-a
|
96
|
+
assert_select 'div.tab-pane#tempo_rary-a .card-slot#A'
|
78
97
|
assert_select 'li > a.load[data-toggle=tab][href=#tempo_rary-b]'
|
79
98
|
assert_select 'div.tab-pane#tempo_rary-b', ''
|
80
99
|
end
|
81
100
|
end
|
82
101
|
|
102
|
+
it 'handles relative names' do
|
103
|
+
Card::Auth.as_bot do
|
104
|
+
Card.create! :name=>'G', :content=>"[[+B]]", :type=>'pointer', :subcards=>{'+B'=>'GammaBeta'}
|
105
|
+
end
|
106
|
+
tabs = Card.fetch('G').format.render_tabs
|
107
|
+
assert_view_select tabs, 'div[role=tabpanel]' do
|
108
|
+
assert_select 'div.tab-pane#g-g-b .card-content', 'GammaBeta'
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
83
112
|
it 'handles item views' do
|
84
113
|
tabs = render_content '{{Fruit+*type+*create|tabs|name}}'
|
85
114
|
assert_view_select tabs, 'div[role=tabpanel]' do
|
@@ -101,5 +130,13 @@ describe Card::Set::All::Collection do
|
|
101
130
|
assert_select 'div.tab-pane#tab_test-a', 'Basic'
|
102
131
|
end
|
103
132
|
end
|
133
|
+
|
134
|
+
it 'works with search cards' do
|
135
|
+
Card.create :type=>'Search', :name=>'Asearch', :content=>%{{"type":"User"}}
|
136
|
+
tabs=render_content("{{Asearch|tabs;item:name}}")
|
137
|
+
assert_view_select tabs, 'div[role=tabpanel]' do
|
138
|
+
assert_select 'li > a[data-toggle=tab][href=#asearch-joe_admin] span.card-title', 'Joe Admin'
|
139
|
+
end
|
140
|
+
end
|
104
141
|
end
|
105
142
|
end
|
@@ -91,6 +91,21 @@ format do
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
+
def search_result_names
|
95
|
+
@search_result_names ||=
|
96
|
+
begin
|
97
|
+
card.item_names search_params
|
98
|
+
rescue => e
|
99
|
+
{ :error => e}
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def each_nest args={}
|
104
|
+
search_result_names.each do |name|
|
105
|
+
yield(name, nest_args(args.reverse_merge!(:item=>:content)))
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
94
109
|
def set_inclusion_opts args
|
95
110
|
@inclusion_defaults = nil
|
96
111
|
@inclusion_opts ||= {}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
|
3
3
|
describe Card::Set::Type::SearchType do
|
4
|
-
it "
|
4
|
+
it "wraps search items with correct view class" do
|
5
5
|
Card.create :type=>'Search', :name=>'Asearch', :content=>%{{"type":"User"}}
|
6
6
|
c=render_content("{{Asearch|core;item:name}}")
|
7
7
|
expect(c).to match('search-result-item item-name')
|
@@ -10,18 +10,20 @@ describe Card::Set::Type::SearchType do
|
|
10
10
|
expect(render_content("{{Asearch|core|titled}}" ).scan('search-result-item item-titled').size).to eq(14)
|
11
11
|
end
|
12
12
|
|
13
|
-
it "
|
13
|
+
it "handles returning 'count'" do
|
14
14
|
expect(render_card(:core, :type=>'Search', :content=>%{{ "type":"User", "return":"count"}})).to eq('14')
|
15
15
|
end
|
16
|
-
|
17
|
-
it "
|
16
|
+
|
17
|
+
it "passes item args correctly" do
|
18
18
|
Card.create!(
|
19
|
-
:name=>'Pointer2Searches',
|
20
|
-
:type_id=>Card::PointerID,
|
19
|
+
:name=>'Pointer2Searches',
|
20
|
+
:type_id=>Card::PointerID,
|
21
21
|
:content=>"[[Layout+*type+by name]]\n[[PlainText+*type+by name]]"
|
22
22
|
)
|
23
23
|
r = render_content "{{Pointer2Searches|core|closed|hide:menu}}"
|
24
24
|
expect(r.scan('"view":"link"').size).to eq(0)
|
25
25
|
expect(r.scan('item-closed').size).to eq(2) #there are two of each
|
26
26
|
end
|
27
|
+
|
28
|
+
it ''
|
27
29
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: card
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.15.
|
4
|
+
version: 1.15.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ethan McCutchen
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2015-06-
|
14
|
+
date: 2015-06-15 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: smartname
|