card 1.16.13 → 1.16.14
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/db/migrate_core_cards/20150501010515_responsive_sidebar.rb +11 -0
- data/db/schema.rb +1 -1
- data/lib/card/auth.rb +3 -2
- data/lib/card/env.rb +1 -1
- data/lib/card/loader.rb +79 -40
- data/lib/card/query.rb +5 -5
- data/lib/card/query/sql_statement.rb +10 -4
- data/lib/card/query/value.rb +5 -8
- data/lib/card/set.rb +0 -1
- data/lib/cardio.rb +18 -22
- data/mod/01_core/chunk/link.rb +37 -34
- data/mod/01_core/chunk/query_reference.rb +1 -1
- data/mod/01_core/set/all/fetch.rb +66 -58
- data/mod/01_core/set/all/permissions.rb +84 -83
- data/mod/01_core/set/all/templating.rb +6 -5
- data/mod/01_core/set/all/type.rb +16 -14
- data/mod/02_basic_types/set/all/base.rb +3 -3
- data/mod/02_basic_types/set/type/pointer.rb +4 -4
- data/mod/02_basic_types/spec/set/all/base_spec.rb +16 -1
- data/mod/03_machines/lib/javascript/wagn_mod.js.coffee +65 -0
- data/mod/05_email/set/all/follow.rb +6 -10
- data/mod/05_email/set/type/email_template.rb +1 -1
- data/mod/05_standard/lib/file_uploader.rb +39 -41
- data/mod/05_standard/set/all/account.rb +18 -20
- data/mod/05_standard/set/all/rich_html/toolbar.rb +1 -1
- data/mod/05_standard/set/right/account.rb +2 -2
- data/mod/05_standard/set/right/email.rb +14 -13
- data/mod/05_standard/set/right/password.rb +20 -12
- data/mod/05_standard/set/right/status.rb +2 -2
- data/mod/05_standard/set/self/head.rb +66 -53
- data/mod/05_standard/set/type/search_type.rb +3 -2
- data/mod/05_standard/set/type/set.rb +3 -3
- data/mod/06_bootstrap/lib/stylesheets/bootstrap_cards.scss +50 -0
- data/spec/lib/card/query_spec.rb +7 -0
- data/spec/spec_helper.rb +1 -1
- metadata +3 -2
@@ -29,7 +29,7 @@ def template
|
|
29
29
|
end
|
30
30
|
|
31
31
|
# EXISTING CARDS
|
32
|
-
elsif structure = structure_rule_card
|
32
|
+
elsif (structure = structure_rule_card)
|
33
33
|
repair_type structure.type_id if assign_type_to?(structure)
|
34
34
|
structure
|
35
35
|
end
|
@@ -60,7 +60,7 @@ def structure_rule_card
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def structuree_names
|
63
|
-
if wql = structuree_spec
|
63
|
+
if (wql = structuree_spec)
|
64
64
|
Auth.as_bot do
|
65
65
|
Card::Query.run(wql.merge return: :name)
|
66
66
|
end
|
@@ -82,7 +82,7 @@ def update_structurees args
|
|
82
82
|
# note that this is not smart about overriding templating rules
|
83
83
|
# for example, if someone were to change the type of a +*right+*structure rule that was overridden
|
84
84
|
# by a +*type plus right+*structure rule, the override would not be respected.
|
85
|
-
if query = structuree_spec
|
85
|
+
if (query = structuree_spec)
|
86
86
|
Auth.as_bot do
|
87
87
|
query[:return] = :id
|
88
88
|
Card::Query.run(query).each_slice(100) do |id_batch|
|
@@ -115,8 +115,9 @@ def repair_type template_type_id
|
|
115
115
|
end
|
116
116
|
|
117
117
|
def structuree_spec
|
118
|
-
|
119
|
-
|
118
|
+
# could use is_rule?...
|
119
|
+
if is_structure? && (ca = trunk) && (ca.type_id = Card::SetID)
|
120
|
+
ca.get_query
|
120
121
|
end
|
121
122
|
end
|
122
123
|
|
data/mod/01_core/set/all/type.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
module ClassMethods
|
3
3
|
def default_type_id
|
4
|
-
@@default_type_id ||= Card[:all].fetch(
|
4
|
+
@@default_type_id ||= Card[:all].fetch(trait: :default).type_id
|
5
5
|
end
|
6
6
|
end
|
7
7
|
|
@@ -11,7 +11,7 @@ def type_card
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def type_code
|
14
|
-
Card::Codename[
|
14
|
+
Card::Codename[type_id.to_i]
|
15
15
|
end
|
16
16
|
|
17
17
|
def type_name
|
@@ -27,38 +27,40 @@ def type= type_name
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def get_type_id_from_structure
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
30
|
+
return unless name && (t = template)
|
31
|
+
reset_patterns # still necessary even with new template handling?
|
32
|
+
t.type_id
|
34
33
|
end
|
35
34
|
|
36
35
|
event :validate_type_change, before: :approve, on: :update, changed: :type_id do
|
37
|
-
if c = dup
|
38
|
-
errors.add :type, "of #{ name } can't be changed; errors creating new
|
36
|
+
if (c = dup) && c.action == :create && !c.valid?
|
37
|
+
errors.add :type, "of #{ name } can't be changed; errors creating new " \
|
38
|
+
"#{ type_id }: #{ c.errors.full_messages * ', ' }"
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
42
|
event :validate_type, before: :approve, changed: :type_id do
|
43
43
|
if !type_name
|
44
|
-
errors.add :type,
|
44
|
+
errors.add :type, 'No such type'
|
45
45
|
end
|
46
46
|
|
47
|
-
if rt = structure
|
48
|
-
errors.add :type, "can't be changed because #{name} is hard templated
|
47
|
+
if (rt = structure) && rt.assigns_type? && type_id != rt.type_id
|
48
|
+
errors.add :type, "can't be changed because #{name} is hard templated " \
|
49
|
+
"to #{rt.type_name}"
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
52
53
|
event :reset_type_specific_fields, after: :store do
|
53
54
|
Auth.as_bot do
|
54
|
-
Card.search left: { left_id: type_id },
|
55
|
+
Card.search left: { left_id: type_id },
|
56
|
+
right: { codename: 'type_plus_right' } do |set_card|
|
55
57
|
set_card.reset_set_patterns
|
56
58
|
end
|
57
59
|
end
|
58
60
|
end
|
59
61
|
|
60
|
-
# Card.search left_plus: [ type_name, right_plus: {codename:
|
62
|
+
# Card.search left_plus: [ type_name, right_plus: {codename:
|
63
|
+
# 'type_plus_right'}] do |right_anchor|
|
61
64
|
# Card["#{lef}"]
|
62
65
|
# set_card.reset_set_patterns
|
63
66
|
# end
|
64
|
-
|
@@ -92,9 +92,9 @@ format do
|
|
92
92
|
# FIXME: - relativity should be handled in smartname
|
93
93
|
return '' unless args[:inc_name]
|
94
94
|
name = args[:inc_name].to_name
|
95
|
-
|
95
|
+
stripped = name.stripped
|
96
96
|
|
97
|
-
if name.relative? && !
|
97
|
+
if name.relative? && !stripped.to_name.starts_with_joint?
|
98
98
|
# not a simple relative name; just return the original syntax
|
99
99
|
"{{#{args[:inc_syntax]}}}"
|
100
100
|
else
|
@@ -105,7 +105,7 @@ format do
|
|
105
105
|
when type = on_type_set
|
106
106
|
"#{type}#{name}+#{Card[:type_plus_right].name}" # *type plus right
|
107
107
|
else
|
108
|
-
"#{
|
108
|
+
"#{stripped.gsub(/^\+/, '')}+#{Card[:right].name}" # *right
|
109
109
|
end
|
110
110
|
subformat(Card.fetch set_name).render_template_link args
|
111
111
|
end
|
@@ -343,24 +343,24 @@ def options_rule_card
|
|
343
343
|
end
|
344
344
|
|
345
345
|
def option_names
|
346
|
-
result_cards = if oc = options_rule_card
|
346
|
+
result_cards = if (oc = options_rule_card)
|
347
347
|
oc.item_names default_limit: 50, context: name
|
348
348
|
else
|
349
349
|
Card.search sort: 'name', limit: 50, return: :name
|
350
350
|
end
|
351
|
-
if selected_options = item_names
|
351
|
+
if (selected_options = item_names)
|
352
352
|
result_cards = result_cards | selected_options
|
353
353
|
end
|
354
354
|
result_cards
|
355
355
|
end
|
356
356
|
|
357
357
|
def option_cards
|
358
|
-
result_cards = if oc = options_rule_card
|
358
|
+
result_cards = if (oc = options_rule_card)
|
359
359
|
oc.item_cards default_limit: 50, context: name
|
360
360
|
else
|
361
361
|
Card.search sort: 'alpha', limit: 50
|
362
362
|
end
|
363
|
-
if selected_options = item_names
|
363
|
+
if (selected_options = item_names)
|
364
364
|
selected_options.each do |item|
|
365
365
|
result_cards.push Card.fetch(item,new: {})
|
366
366
|
end
|
@@ -51,7 +51,22 @@ describe Card::Set::All::Base do
|
|
51
51
|
expect(render_card(:array, content: 'yoing')).to eq(%{["yoing"]})
|
52
52
|
end
|
53
53
|
end
|
54
|
-
|
54
|
+
it 'renders template rule of embed cards based on set' do
|
55
|
+
Card::Auth.as_bot
|
56
|
+
content = '{{_left+test_another_card|content|content;'\
|
57
|
+
'structure:test_another_card_structure}}'
|
58
|
+
card = Card.create! name: 'test_card+*right+*structure',
|
59
|
+
type_id: Card::HTMLID, content: content
|
60
|
+
Card.create! name: 'test_another_card+*right+*structure',
|
61
|
+
type_id: Card::SearchTypeID,
|
62
|
+
content: ' {"type":"basic","left":"_1"}'
|
63
|
+
html = card.format.render_open
|
64
|
+
href = '/test_another_card+*right?view=template_editor'
|
65
|
+
text = '_left+test_another_card|content|content;'\
|
66
|
+
'structure:test_another_card_structure'
|
67
|
+
expect(html).to have_tag('a', with: { class: 'slotter', href: href },
|
68
|
+
text: text)
|
69
|
+
end
|
55
70
|
end
|
56
71
|
end
|
57
72
|
|
@@ -174,9 +174,68 @@ $.extend wagn,
|
|
174
174
|
/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(userAgent) or /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(userAgent.substr(0, 4))
|
175
175
|
|
176
176
|
|
177
|
+
# sidebars
|
178
|
+
|
179
|
+
wrapDeckoLayout = () ->
|
180
|
+
$('body > article, body > aside, body > footer').wrapAll('<div class="container"/>')
|
181
|
+
$('div.container > article, div.container > aside').wrapAll('<div class="row row-offcanvas">')
|
182
|
+
|
183
|
+
wrapSidebarToggle = (toggle) ->
|
184
|
+
"<div class='container'><div class='row'>#{toggle}</div></div>"
|
185
|
+
|
186
|
+
sidebarToggle = (side) ->
|
187
|
+
"<button class='offcanvas-toggle offcanvas-toggle-#{side} btn btn-secondary visible-xs' data-toggle='offcanvas-#{side}'><span class='glyphicon glyphicon-chevron-#{if side == 'left' then 'right' else 'left'}'/></button>"
|
188
|
+
|
189
|
+
singleSidebar = (side) ->
|
190
|
+
$article = $('body > article').first()
|
191
|
+
$aside = $('body > aside').first()
|
192
|
+
$article.addClass("col-xs-12 col-sm-9")
|
193
|
+
$aside.addClass("col-xs-6 col-sm-3 sidebar-offcanvas sidebar-offcanvas-#{side}")
|
194
|
+
if side == 'left'
|
195
|
+
$('body').append($aside).append($article)
|
196
|
+
else
|
197
|
+
$('body').append($article).append($aside)
|
198
|
+
|
199
|
+
wrapDeckoLayout()
|
200
|
+
$article.prepend(wrapSidebarToggle(sidebarToggle(side)))
|
201
|
+
|
202
|
+
|
203
|
+
doubleSidebar = ->
|
204
|
+
$article = $('body > article').first()
|
205
|
+
$asideLeft = $('body > aside').first()
|
206
|
+
$asideRight = $($('body > aside')[1])
|
207
|
+
$article.addClass("col-xs-12 col-sm-6")
|
208
|
+
$asideLeft.addClass("col-xs-6 col-sm-3 sidebar-offcanvas sidebar-offcanvas-left")
|
209
|
+
$asideRight.addClass("col-xs-6 col-sm-3 sidebar-offcanvas sidebar-offcanvas-right")
|
210
|
+
$('body').append($asideLeft).append($article).append($asideRight)
|
211
|
+
|
212
|
+
wrapDeckoLayout()
|
213
|
+
$article.prepend(wrapSidebarToggle("#{sidebarToggle('right')}#{sidebarToggle('left')}"))
|
177
214
|
|
178
215
|
$(window).ready ->
|
179
216
|
|
217
|
+
#sidebar
|
218
|
+
|
219
|
+
switch
|
220
|
+
when $('body').hasClass('right-sidebar')
|
221
|
+
singleSidebar('right')
|
222
|
+
|
223
|
+
when $('body').hasClass('left-sidebar')
|
224
|
+
singleSidebar('left')
|
225
|
+
|
226
|
+
when $('body').hasClass('two-sidebar')
|
227
|
+
doubleSidebar()
|
228
|
+
|
229
|
+
$('[data-toggle="offcanvas-left"]').click ->
|
230
|
+
$('.row-offcanvas').removeClass('right-active').toggleClass('left-active')
|
231
|
+
$(this).find('span.glyphicon').toggleClass('glyphicon-chevron-left glyphicon-chevron-right')
|
232
|
+
$('[data-toggle="offcanvas-right"]').click ->
|
233
|
+
$('.row-offcanvas').removeClass('left-active').toggleClass('right-active')
|
234
|
+
$(this).find('span.glyphicon').toggleClass('glyphicon-chevron-left glyphicon-chevron-right')
|
235
|
+
|
236
|
+
|
237
|
+
|
238
|
+
|
180
239
|
$('body').on 'click', '.cancel-upload', ->
|
181
240
|
editor = $(this).closest '.card-editor'
|
182
241
|
editor.find('.choose-file').show()
|
@@ -196,6 +255,8 @@ $(window).ready ->
|
|
196
255
|
# sadly, it also causes odd navbox behavior, resetting the search term
|
197
256
|
}
|
198
257
|
|
258
|
+
|
259
|
+
|
199
260
|
#pointer mod
|
200
261
|
$('body').on 'click', '.pointer-item-add', (event)->
|
201
262
|
last_item = $(this).closest('.content-editor').find '.pointer-li:last'
|
@@ -485,3 +546,7 @@ navbox_select = (event, ui) ->
|
|
485
546
|
|
486
547
|
|
487
548
|
|
549
|
+
|
550
|
+
|
551
|
+
|
552
|
+
|
@@ -186,22 +186,22 @@ def follower_ids
|
|
186
186
|
end
|
187
187
|
end
|
188
188
|
|
189
|
-
|
190
189
|
def direct_followers
|
191
190
|
direct_follower_ids.map do |id|
|
192
191
|
Card.fetch(id)
|
193
192
|
end
|
194
193
|
end
|
195
194
|
|
196
|
-
# all ids of users that follow this card because of a follow rule that applies
|
197
|
-
# doesn't include users that follow this card because they are
|
195
|
+
# all ids of users that follow this card because of a follow rule that applies
|
196
|
+
# to this card doesn't include users that follow this card because they are
|
197
|
+
# following parent cards or other cards that include this card
|
198
198
|
def direct_follower_ids args={}
|
199
199
|
result = ::Set.new
|
200
200
|
with_follower_candidate_ids do
|
201
201
|
set_names.each do |set_name|
|
202
202
|
set_card = Card.fetch(set_name)
|
203
203
|
set_card.all_user_ids_with_rule_for(:follow).each do |user_id|
|
204
|
-
if (!result.include? user_id)
|
204
|
+
if (!result.include? user_id) && self.follow_rule_applies?(user_id)
|
205
205
|
result << user_id
|
206
206
|
end
|
207
207
|
end
|
@@ -216,7 +216,8 @@ def all_direct_follower_ids_with_reason
|
|
216
216
|
set_names.each do |set_name|
|
217
217
|
set_card = Card.fetch(set_name)
|
218
218
|
set_card.all_user_ids_with_rule_for(:follow).each do |user_id|
|
219
|
-
if (!visited.include?(user_id)) &&
|
219
|
+
if (!visited.include?(user_id)) &&
|
220
|
+
(follow_option = self.follow_rule_applies?(user_id))
|
220
221
|
visited << user_id
|
221
222
|
yield(user_id, set_card: set_card, option: follow_option)
|
222
223
|
end
|
@@ -225,8 +226,6 @@ def all_direct_follower_ids_with_reason
|
|
225
226
|
end
|
226
227
|
end
|
227
228
|
|
228
|
-
|
229
|
-
|
230
229
|
#~~~~~ cache methods
|
231
230
|
|
232
231
|
def write_follower_ids_cache user_ids
|
@@ -240,7 +239,6 @@ def read_follower_ids_cache
|
|
240
239
|
end
|
241
240
|
|
242
241
|
module ClassMethods
|
243
|
-
|
244
242
|
def follow_caches_expired
|
245
243
|
Card.clear_follower_ids_cache
|
246
244
|
Card.clear_user_rule_cache
|
@@ -257,6 +255,4 @@ module ClassMethods
|
|
257
255
|
def clear_follower_ids_cache
|
258
256
|
Card.cache.write FOLLOWER_IDS_CACHE_KEY, nil
|
259
257
|
end
|
260
|
-
|
261
258
|
end
|
262
|
-
|
@@ -101,7 +101,7 @@ format do
|
|
101
101
|
|
102
102
|
if attachment_list
|
103
103
|
attachment_list.each_with_index do |cardname, i|
|
104
|
-
if c = Card[ cardname ]
|
104
|
+
if (c = Card[ cardname ]) && c.respond_to?(:attachment)
|
105
105
|
add_file filename: "attachment-#{i + 1}.#{c.attachment.extension}", content: File.read( c.attachment.path )
|
106
106
|
end
|
107
107
|
end
|
@@ -1,38 +1,33 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
(
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
mark.ext
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
~22/33-medium.png
|
26
|
-
:yeti_skin/05_standard-large.png
|
27
|
-
|
28
|
-
=end
|
29
|
-
|
1
|
+
# *DATABASE_CONTENT*
|
2
|
+
# if in mod:
|
3
|
+
# :codename/modname.ext
|
4
|
+
# else
|
5
|
+
# ~card_id/action_id.ext
|
6
|
+
#
|
7
|
+
# *FILE SYSTEM*
|
8
|
+
# if in mod
|
9
|
+
# (mod_dir)/files/codename/type_code-variant.ext (no colon on codename!)
|
10
|
+
# else
|
11
|
+
# (files_dir)/id/action_id-variant.ext (no tilde on id!)
|
12
|
+
#
|
13
|
+
# variant = icon|small|medium|large|original (only for images)
|
14
|
+
#
|
15
|
+
# *URLS*
|
16
|
+
# mark.ext
|
17
|
+
# mark/revision.ext
|
18
|
+
# mark/revision-variant.ext
|
19
|
+
#
|
20
|
+
# revision = modname or action_id
|
21
|
+
#
|
22
|
+
# Examples:
|
23
|
+
# ~22/33-medium.png
|
24
|
+
# :yeti_skin/05_standard-large.png
|
30
25
|
|
31
26
|
module CarrierWave::Uploader::Versions
|
32
27
|
private
|
33
28
|
|
34
29
|
# put version at the end of the filename
|
35
|
-
def full_filename
|
30
|
+
def full_filename for_file
|
36
31
|
name = super(for_file)
|
37
32
|
parts = name.split '.'
|
38
33
|
basename = [parts.shift, version_name].compact.join('-')
|
@@ -56,9 +51,9 @@ class FileUploader < CarrierWave::Uploader::Base
|
|
56
51
|
|
57
52
|
def extension
|
58
53
|
case
|
59
|
-
when file && file.extension.present?
|
60
|
-
when card_content = model.content
|
61
|
-
when orig = original_filename
|
54
|
+
when file && file.extension.present? then ".#{file.extension}"
|
55
|
+
when card_content = model.content then File.extname(card_content)
|
56
|
+
when orig = original_filename then File.extname(orig)
|
62
57
|
else ''
|
63
58
|
end.downcase
|
64
59
|
end
|
@@ -68,7 +63,7 @@ class FileUploader < CarrierWave::Uploader::Base
|
|
68
63
|
if opts[:mod] && !model.load_from_mod
|
69
64
|
model.load_from_mod = opts[:mod]
|
70
65
|
end
|
71
|
-
|
66
|
+
'%s/%s' % [file_dir, url_filename(opts)]
|
72
67
|
end
|
73
68
|
|
74
69
|
def url_filename opts={}
|
@@ -84,7 +79,8 @@ class FileUploader < CarrierWave::Uploader::Base
|
|
84
79
|
end
|
85
80
|
|
86
81
|
def url opts = {}
|
87
|
-
|
82
|
+
'%s/%s/%s' % [card_path(Card.config.files_web_path), file_dir,
|
83
|
+
full_filename(url_filename(opts))]
|
88
84
|
end
|
89
85
|
|
90
86
|
def file_dir
|
@@ -104,8 +100,9 @@ class FileUploader < CarrierWave::Uploader::Base
|
|
104
100
|
# Carrierwave calls store_path without argument when it stores the file
|
105
101
|
# and with the identifier from the db when it retrieves the file
|
106
102
|
# In our case the first part of our identifier is not part of the path
|
107
|
-
# but we can construct the filename from db data. So we don't need the
|
108
|
-
|
103
|
+
# but we can construct the filename from db data. So we don't need the
|
104
|
+
# identifier.
|
105
|
+
def store_path for_file=nil
|
109
106
|
if for_file
|
110
107
|
retrieve_path
|
111
108
|
else
|
@@ -124,17 +121,18 @@ class FileUploader < CarrierWave::Uploader::Base
|
|
124
121
|
File.join model.tmp_upload_dir, filename
|
125
122
|
end
|
126
123
|
|
127
|
-
def create_versions?
|
124
|
+
def create_versions? _new_file
|
128
125
|
model.create_versions?
|
129
126
|
end
|
130
127
|
|
131
128
|
# paperclip compatibility used in type/file.rb#core (base format)
|
132
|
-
def path
|
129
|
+
def path version=nil
|
133
130
|
version ? versions[version].path : super()
|
134
131
|
end
|
135
132
|
|
136
133
|
def original_filename
|
137
|
-
@original_filename ||=
|
134
|
+
@original_filename ||= model.selected_action &&
|
135
|
+
model.selected_action.comment
|
138
136
|
end
|
139
137
|
|
140
138
|
def store_dir
|
@@ -152,4 +150,4 @@ class FileUploader < CarrierWave::Uploader::Base
|
|
152
150
|
def action_id
|
153
151
|
model.selected_content_action_id
|
154
152
|
end
|
155
|
-
end
|
153
|
+
end
|