card 1.18.3 → 1.18.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/card.gemspec +5 -3
  4. data/db/schema.rb +1 -1
  5. data/lib/card/active_record_helper.rb +2 -1
  6. data/lib/card/core_ext.rb +8 -0
  7. data/lib/card/format/nest.rb +13 -2
  8. data/lib/card/format/render.rb +7 -1
  9. data/lib/card/migration.rb +2 -1
  10. data/lib/card/set.rb +55 -70
  11. data/lib/card/set/trait.rb +70 -0
  12. data/lib/card/stage.rb +33 -8
  13. data/lib/card/stage_director.rb +3 -1
  14. data/lib/cardio.rb +2 -1
  15. data/mod/01_core/chunk/link.rb +7 -6
  16. data/mod/01_core/set/all/collection.rb +15 -52
  17. data/mod/01_core/set/all/fetch.rb +26 -6
  18. data/mod/01_core/set/all/references.rb +11 -3
  19. data/mod/01_core/set/all/subcards.rb +2 -2
  20. data/mod/01_core/set/all/tracked_attributes.rb +5 -1
  21. data/mod/01_core/set/all/utils.rb +1 -1
  22. data/mod/01_core/spec/set/all/collection_spec.rb +2 -2
  23. data/mod/01_history/set/all/content_history.rb +10 -11
  24. data/mod/02_basic_types/set/abstract/code_file.rb +57 -0
  25. data/mod/02_basic_types/set/type/pointer.rb +9 -5
  26. data/mod/03_machines/lib/javascript/wagn.js.coffee +4 -1
  27. data/mod/03_machines/lib/javascript/wagn_mod.js.coffee +29 -24
  28. data/mod/03_machines/set/self/script_ace.rb +1 -11
  29. data/mod/03_machines/set/self/script_card_menu.rb +1 -10
  30. data/mod/03_machines/set/self/script_html5shiv_printshiv.rb +1 -2
  31. data/mod/03_machines/set/self/script_jquery.rb +1 -2
  32. data/mod/03_machines/set/self/script_jquery_helper.rb +4 -7
  33. data/mod/03_machines/set/self/script_slot.rb +4 -6
  34. data/mod/03_machines/set/self/script_tinymce.rb +1 -2
  35. data/mod/03_machines/set/self/style_bootstrap_compatible.rb +1 -5
  36. data/mod/03_machines/set/self/style_cards.rb +1 -6
  37. data/mod/03_machines/set/self/style_jquery_ui_smoothness.rb +1 -2
  38. data/mod/03_machines/set/type/coffee_script.rb +1 -1
  39. data/mod/03_machines/set/type/css.rb +10 -1
  40. data/mod/03_machines/set/type/java_script.rb +16 -1
  41. data/mod/03_machines/set/type/scss.rb +3 -2
  42. data/mod/05_standard/lib/image_uploader.rb +15 -0
  43. data/mod/05_standard/set/all/rich_html/editing.rb +2 -2
  44. data/mod/05_standard/set/all/rich_html/form.rb +40 -19
  45. data/mod/05_standard/set/all/rich_html/modal.rb +4 -2
  46. data/mod/05_standard/set/all/rich_html/toolbar.rb +88 -39
  47. data/mod/05_standard/set/type/search_type.rb +6 -3
  48. data/mod/06_bootstrap/set/all/bootstrap/table.rb +55 -0
  49. data/mod/06_bootstrap/set/all/bootstrap/tabs.rb +81 -0
  50. data/mod/06_bootstrap/set/self/bootstrap_cards.rb +1 -9
  51. data/mod/06_bootstrap/set/self/bootstrap_js.rb +4 -6
  52. data/mod/06_bootstrap/set/self/bootswatch_shared.rb +11 -3
  53. data/mod/06_bootstrap/set/self/smartmenu_css.rb +3 -5
  54. data/mod/06_bootstrap/set/self/smartmenu_js.rb +3 -5
  55. data/spec/lib/card/set/trait_spec.rb +62 -0
  56. metadata +24 -3
@@ -48,6 +48,7 @@ class Card
48
48
 
49
49
  @stage = nil
50
50
  @running = false
51
+ @prepared = false
51
52
  @parent = opts[:parent]
52
53
  # has card to be stored before the supercard?
53
54
  @prior_store = opts[:priority]
@@ -72,7 +73,8 @@ class Card
72
73
  end
73
74
 
74
75
  def prepare_for_phases
75
- @card.prepare_for_phases
76
+ @card.prepare_for_phases unless @prepared
77
+ @prepared = true
76
78
  @subdirectors.each(&:prepare_for_phases)
77
79
  end
78
80
 
@@ -169,7 +169,8 @@ module Cardio
169
169
  original_suffix = ActiveRecord::Base.table_name_suffix
170
170
  ActiveRecord::Base.table_name_suffix = new_suffix
171
171
  ActiveRecord::SchemaMigration.reset_table_name
172
- yield
172
+ paths = Cardio.migration_paths(type)
173
+ yield(paths)
173
174
  ActiveRecord::Base.table_name_suffix = original_suffix
174
175
  ActiveRecord::SchemaMigration.reset_table_name
175
176
  end
@@ -4,14 +4,15 @@ require_dependency File.expand_path('../reference', __FILE__)
4
4
 
5
5
  module Card::Content::Chunk
6
6
  class Link < Reference
7
+ CODE = 'L'.freeze # L for "Link"
7
8
  attr_reader :link_text
8
9
  # Groups: $1, [$2]: [[$1]] or [[$1|$2]] or $3, $4: [$3][$4]
9
10
  Card::Content::Chunk.register_class self,
10
- prefix_re: '\\[',
11
- full_re: /^\[\[([^\]]+)\]\]/,
12
- idx_char: '['
11
+ prefix_re: '\\[',
12
+ full_re: /^\[\[([^\]]+)\]\]/,
13
+ idx_char: '['
13
14
  def reference_code
14
- 'L' # L for "Link"
15
+ CODE
15
16
  end
16
17
 
17
18
  def interpret match, _content
@@ -37,7 +38,7 @@ module Card::Content::Chunk
37
38
  # point is to find the first pipe that's not inside an nest
38
39
  return unless string.index '|'
39
40
  string_copy = "#{string}" # had to do this to create new string?!
40
- string.scan /\{\{[^\}]*\}\}/ do |incl|
41
+ string.scan(/\{\{[^\}]*\}\}/) do |incl|
41
42
  string_copy.gsub! incl, ('x' * incl.length)
42
43
  end
43
44
  string_copy.index '|'
@@ -77,7 +78,7 @@ module Card::Content::Chunk
77
78
  def replace_reference old_name, new_name
78
79
  replace_name_reference old_name, new_name
79
80
 
80
- if Card::Content === @link_text
81
+ if @link_text.is_a?(Card::Content)
81
82
  @link_text.find_chunks(Card::Content::Chunk::Reference).each do |chunk|
82
83
  chunk.replace_reference old_name, new_name
83
84
  end
@@ -253,23 +253,19 @@ format :html do
253
253
  end
254
254
 
255
255
  view :tabs do |args|
256
- tab_buttons = ''
257
- tab_panes = ''
258
- active_tab = true
256
+ active_name = nil
257
+ active_content = nil
258
+ tabs = {}
259
259
  each_reference_with_args(item: :content) do |name, nest_args|
260
- id = "#{card.cardname.safe_key}-#{name.to_name.safe_key}"
261
- url = nest_path name, nest_args
262
- tab_name = nest_args[:title] || name
263
- tab_buttons += tab_button(
264
- "##{id}", tab_name, active_tab, 'data-url' => url.html_safe,
265
- class: (active_tab ? nil : 'load'))
266
-
267
- # only render the first active tab, other tabs get loaded via ajax
268
- tab_content = active_tab ? nest(Card.fetch(name, new: {}), nest_args) : ''
269
- tab_panes += tab_pane(id, tab_content, active_tab)
270
- active_tab = false
260
+ tab_name = nest_args[:title] || name
261
+ tabs[tab_name] = nest_path(name, nest_args).html_safe
262
+
263
+ active_name ||= tab_name
264
+ # warning: nest changes nest_args
265
+ active_content ||= nest(Card.fetch(name, new: {}), nest_args)
271
266
  end
272
- tab_panel tab_buttons, tab_panes, args[:tab_type]
267
+ lazy_loading_tabs tabs, active_name, active_content,
268
+ type: args[:tab_type]
273
269
  end
274
270
  def default_tabs_args args
275
271
  args[:tab_type] ||= 'tabs'
@@ -290,15 +286,11 @@ format :html do
290
286
  end
291
287
 
292
288
  view :tabs_static do |args|
293
- tab_buttons = ''
294
- tab_panes = ''
295
- card.item_cards.each_with_index do |item, index|
296
- id = "#{card.cardname.safe_key}-#{item.cardname.safe_key}"
297
- tab_buttons += tab_button("##{id}", item.name, index == 0)
298
- tab_content = nest item, item_args(args)
299
- tab_panes += tab_pane(id, tab_content, index == 0)
289
+ tabs = {}
290
+ card.item_cards.each do |item|
291
+ tabs[item.name] = nest item, item_args(args)
300
292
  end
301
- tab_panel tab_buttons, tab_panes, args[:tab_type]
293
+ static_tabs tabs, args[:tab_type]
302
294
  end
303
295
  def default_tabs_static_args args
304
296
  args[:tab_type] ||= 'tabs'
@@ -308,33 +300,4 @@ format :html do
308
300
  def default_tabs_static_args args
309
301
  args[:tab_type] ||= 'pills'
310
302
  end
311
-
312
- def tab_panel tab_buttons, tab_panes, tab_type='tabs'
313
- wrap_with :div, role: 'tabpanel' do
314
- [
315
- content_tag(:ul, tab_buttons.html_safe, class: "nav nav-#{tab_type}",
316
- role: 'tablist'),
317
- content_tag(:div, tab_panes.html_safe, class: 'tab-content')
318
- ]
319
- end
320
- end
321
-
322
- def tab_button target, text, active=false, link_attr={}
323
- link = link_to(
324
- fancy_title(text),
325
- target,
326
- link_attr.merge('role' => 'tab', 'data-toggle' => 'tab'))
327
- li_args = { role: :presentation }
328
- li_args[:class] = 'active' if active
329
- content_tag :li, link, li_args
330
- end
331
-
332
- def tab_pane id, content, active=false
333
- div_args = {
334
- role: :tabpanel,
335
- id: id,
336
- class: "tab-pane #{'active' if active}"
337
- }
338
- content_tag :div, content.html_safe, div_args
339
- end
340
303
  end
@@ -10,11 +10,12 @@ module ClassMethods
10
10
  # - database
11
11
  # - virtual cards
12
12
  #
13
- # "mark" here means one of three unique identifiers
13
+ # @param [Integer, String, Card::Name, Symbol] mark one of three unique
14
+ # identifiers
14
15
  # 1. a numeric id (Integer)
15
16
  # 2. a name/key (String or Card::Name)
16
17
  # 3. a codename (Symbol)
17
- #
18
+ # @param [Hash] opts ({})
18
19
  # Options:
19
20
  # :skip_virtual Real cards only
20
21
  # :skip_modules Don't load Set modules
@@ -38,6 +39,25 @@ module ClassMethods
38
39
  standard_fetch_results card, mark, opts
39
40
  end
40
41
 
42
+ # #fetch converts String to Card::Name. That can break in some cases.
43
+ # For example if you fetch "Siemens" by its key "siemen", you won't get
44
+ # "Siemens" because "siemen".to_name.key == "sieman"
45
+ # If you have a key of a real card use this method.
46
+ def fetch_real_by_key key, opts={}
47
+ raise Card::Error, 'fetch_real_by_key called with new args' if opts[:new]
48
+
49
+ # look in cache
50
+ card = fetch_from_cache_by_key key, opts[:local_only]
51
+ # look in db if needed
52
+ if retrieve_from_db?(card, opts)
53
+ card = fetch_from_db :key, key, opts
54
+ write_to_cache card, opts if !card.nil? && !card.trash
55
+ end
56
+ return if card.nil?
57
+ card.include_set_modules unless opts[:skip_modules]
58
+ card
59
+ end
60
+
41
61
  def standard_fetch_results card, mark, opts
42
62
  if card.new_card?
43
63
  case
@@ -174,8 +194,8 @@ module ClassMethods
174
194
 
175
195
  def new_for_cache card, name, opts
176
196
  return if name.is_a? Integer
177
- return if !name.present? && !opts[:new]
178
- return unless !card || (card.type_unknown? && !skip_type_lookup?(opts))
197
+ return if name.blank? && !opts[:new]
198
+ return if card && (card.type_known? || skip_type_lookup?(opts))
179
199
  new name: name,
180
200
  skip_modules: true,
181
201
  skip_type_lookup: skip_type_lookup?(opts)
@@ -294,8 +314,8 @@ def eager_renew? opts
294
314
  opts[:skip_virtual] && new_card? && opts[:new].present?
295
315
  end
296
316
 
297
- def type_unknown?
298
- type_id.nil?
317
+ def type_known?
318
+ type_id.present?
299
319
  end
300
320
 
301
321
  def name_from_mark! mark, opts
@@ -65,9 +65,8 @@ end
65
65
  # insert entries in reference table
66
66
  def create_references_out
67
67
  ref_hash = {}
68
- content_obj = Card::Content.new raw_content, self
69
- content_obj.find_chunks(Card::Content::Chunk::Reference).each do |chunk|
70
- interpret_reference ref_hash, chunk.referee_name, chunk.reference_code
68
+ each_reference_out do |referee_name, ref_type|
69
+ interpret_reference ref_hash, referee_name, ref_type
71
70
  end
72
71
  return if ref_hash.empty?
73
72
  Card::Reference.mass_insert reference_values_array(ref_hash)
@@ -121,6 +120,15 @@ def reference_values_array ref_hash
121
120
  values
122
121
  end
123
122
 
123
+ # invokes the given block for each reference in raw_content with
124
+ # the reference name and reference type
125
+ def each_reference_out
126
+ content_obj = Card::Content.new raw_content, self
127
+ content_obj.find_chunks(Card::Content::Chunk::Reference).each do |chunk|
128
+ yield(chunk.referee_name, chunk.reference_code)
129
+ end
130
+ end
131
+
124
132
  protected
125
133
 
126
134
  # test for updating referer content & preload referer list
@@ -1,5 +1,5 @@
1
- def field tag
2
- Card[cardname.field(tag)]
1
+ def field tag, opts={}
2
+ Card.fetch cardname.field(tag), opts
3
3
  end
4
4
 
5
5
  def subcard card_name
@@ -1,7 +1,6 @@
1
1
  def assign_attributes args={}
2
2
  if args
3
3
  args = args.stringify_keys
4
-
5
4
  @set_specific = {}
6
5
  Card.set_specific_attributes.each do |key|
7
6
  @set_specific[key] = args.delete(key) if args[key]
@@ -31,6 +30,11 @@ protected
31
30
 
32
31
  def extract_subcard_args! args
33
32
  subcards = args.delete('subcards') || {}
33
+ if (subfields = args.delete('subfields'))
34
+ subfields.each_pair do |key, value|
35
+ subcards[cardname.field(key)] = value
36
+ end
37
+ end
34
38
  args.keys.each do |key|
35
39
  subcards[key] = args.delete(key) if key =~ /^\+/
36
40
  end
@@ -93,7 +93,7 @@ module ClassMethods
93
93
  end
94
94
 
95
95
  def debug_type
96
- "#{type_code || 'no code'}:#{type_id}"
96
+ "#{type_code || ''}:#{type_id}"
97
97
  end
98
98
 
99
99
  def to_s
@@ -142,9 +142,9 @@ describe Card::Set::All::Collection do
142
142
  tabs = render_card :tabs, name: 'tab_test', type_id: Card::PlainTextID,
143
143
  content: '{{A|type;title:my tab title}}'
144
144
  assert_view_select tabs, 'div[role=tabpanel]' do
145
- assert_select 'li > a[data-toggle=tab][href="#tab_test-a"]',
145
+ assert_select 'li > a[data-toggle=tab][href="#tab_test-my_tab_title"]',
146
146
  'my tab title'
147
- assert_select 'div.tab-pane#tab_test-a', 'Basic'
147
+ assert_select 'div.tab-pane#tab_test-my_tab_title', 'Basic'
148
148
  end
149
149
  end
150
150
 
@@ -28,21 +28,20 @@ def save_content_draft content
28
28
  end
29
29
 
30
30
  def last_change_on field, opts={}
31
- where_sql = 'card_actions.card_id = :card_id AND field = :field '
32
- where_sql += 'AND (draft is not true) ' unless opts[:including_drafts]
33
- where_sql += if opts[:before]
34
- 'AND card_action_id < :action_id'
35
- elsif opts[:not_after]
36
- 'AND card_action_id <= :action_id'
37
- else
38
- ''
39
- end
31
+ where_sql = 'card_actions.card_id = :card_id AND field = :field'
32
+ where_sql += ' AND (draft is not true)' unless opts[:including_drafts]
33
+ if opts[:before]
34
+ where_sql += ' AND card_action_id < :action_id'
35
+ elsif opts[:not_after]
36
+ where_sql += ' AND card_action_id <= :action_id'
37
+ end
40
38
 
41
39
  action_arg = opts[:before] || opts[:not_after]
42
40
  action_id = action_arg.is_a?(Card::Action) ? action_arg.id : action_arg
43
- field_index = Card::TRACKED_FIELDS.index(field.to_s)
44
41
  Change.joins(:action).where(
45
- where_sql, card_id: id, field: field_index, action_id: action_id
42
+ where_sql, card_id: id,
43
+ field: Card::Change.field_index(field),
44
+ action_id: action_id
46
45
  ).order(:id).last
47
46
  end
48
47
 
@@ -0,0 +1,57 @@
1
+ def self.included host_class
2
+ # extract the mod name from the path of the set's tmp file
3
+ # the caller that included the set file is set.rb
4
+ # seems like the actual set file is in fourth position in
5
+ # the backtrace but I'm not 100% sure if that is always the case
6
+ path, = caller[4].partition(':')
7
+ path_parts = path.split(File::SEPARATOR)
8
+ mod_dir = path_parts[path_parts.index('set') + 1]
9
+ raise Card::Error, "not a set path: #{path}" unless mod_dir
10
+ match = mod_dir.match(/^mod\d+-(?<mod_name>.+)$/)
11
+ host_class.mattr_accessor :file_content_mod_name
12
+ host_class.file_content_mod_name = match[:mod_name]
13
+ end
14
+
15
+ # @return [Array<String>, String] the name of file(s) to be loaded
16
+ def source_files
17
+ case type_id
18
+ when CoffeeScriptID then "#{codename}.js.coffee"
19
+ when JavaScriptID then "#{codename}.js"
20
+ when CssID then "#{codename}.css"
21
+ when ScssID then "#{codename}.scss"
22
+ end
23
+ end
24
+
25
+ def source_dir
26
+ case type_id
27
+ when CoffeeScriptID, JavaScriptID then 'javascript'
28
+ when CssID, ScssID then 'stylesheets'
29
+ end
30
+ end
31
+
32
+ def find_file filename
33
+ Card.paths['mod'].to_a.each do |mod_path|
34
+ file_path =
35
+ File.join(mod_path, file_content_mod_name, 'lib', source_dir, filename)
36
+ return file_path if File.exist? file_path
37
+ end
38
+ nil
39
+ end
40
+
41
+ view :raw do |_args|
42
+ Array.wrap(card.source_files).map do |filename|
43
+ if (source_path = card.find_file(filename))
44
+ Rails.logger.info "reading file: #{source_path}"
45
+ File.read source_path
46
+ else
47
+ Rails.logger.info "couldn't locate file: #{filename}"
48
+ nil
49
+ end
50
+ end.compact.join "\n"
51
+ end
52
+
53
+ format :html do
54
+ view :editor do |_args|
55
+ "Content is stored in file and can't be edited."
56
+ end
57
+ end
@@ -240,17 +240,21 @@ end
240
240
  # while a card's card type and content are updated in the same request,
241
241
  # the new module will override the old module's events and functions.
242
242
  # this event is only on pointer card. Other type cards do not have this event,
243
- # so it is not overridden and will be run while updating type and content in the same request.
244
- event :standardize_items, :prepare_to_validate, on: :save, changed: :content,
245
- when: proc { |c| c.type_id == Card::PointerID } do
246
- self.content = item_names(context: :raw).map { |name| "[[#{name}]]" }.join "\n"
243
+ # so it is not overridden and will be run while updating type and content in
244
+ # the same request.
245
+ event :standardize_items, :prepare_to_validate,
246
+ on: :save,
247
+ changed: :content,
248
+ when: proc { |c| c.type_id == Card::PointerID } do
249
+ self.content = item_names(context: :raw).map do |name|
250
+ "[[#{name}]]"
251
+ end.join "\n"
247
252
  end
248
253
 
249
254
  def diff_args
250
255
  { format: :pointer }
251
256
  end
252
257
 
253
-
254
258
  def item_cards args={}
255
259
  if args[:complete]
256
260
  query = args.reverse_merge referred_to_by: name
@@ -43,7 +43,7 @@ jQuery.fn.extend {
43
43
  target_slot = $(parent_slot).find(@data('slot-selector'))
44
44
  parent_slot = $(parent_slot).parent().closest '.card-slot'
45
45
  if target_slot.length == 0
46
- $('body').find(@data('slot-selector'))
46
+ $(@data('slot-selector'))
47
47
  else
48
48
  target_slot
49
49
  else
@@ -167,11 +167,14 @@ $(window).ready ->
167
167
  unless event.slotSuccessful
168
168
  slot_top_pos = $(this).slot().offset().top
169
169
  $(this).slotSuccess data
170
+ if $(this).hasClass "close-modal"
171
+ $(this).closest('.modal').modal('hide')
170
172
  # should scroll to top after clicking on new page
171
173
  if $(this).hasClass "card-paging-link"
172
174
  $("body").scrollTop slot_top_pos
173
175
  event.slotSuccessful = true
174
176
 
177
+
175
178
  $('body').on 'loaded.bs.modal', null, (event) ->
176
179
  unless event.slotSuccessful
177
180
  wagn.initializeEditors $(event.target)
@@ -4,35 +4,34 @@ window.wagn ||= {} #needed to run w/o *head. eg. jasmine
4
4
 
5
5
  $.extend wagn,
6
6
  editorContentFunctionMap: {
7
- '.ace-editor-textarea' : -> ace_editor_content this[0]
8
- '.tinymce-textarea' : -> tinyMCE.get(@[0].id).getContent()
9
- '.pointer-select' : -> pointerContent @val()
10
- '.pointer-multiselect' : -> pointerContent @val()
11
- '.pointer-radio-list' : -> pointerContent @find('input:checked').val()
12
- '.pointer-list-ul' : ->
7
+ '.ace-editor-textarea': -> ace_editor_content this[0]
8
+ '.tinymce-textarea': -> tinyMCE.get(@[0].id).getContent()
9
+ '.pointer-select': -> pointerContent @val()
10
+ '.pointer-multiselect': -> pointerContent @val()
11
+ '.pointer-radio-list': -> pointerContent @find('input:checked').val()
12
+ '.pointer-list-ul': ->
13
13
  pointerContent @find('input').map( -> $(this).val() )
14
- '.pointer-checkbox-list' : ->
14
+ '.pointer-checkbox-list': ->
15
15
  pointerContent @find('input:checked').map( -> $(this).val() )
16
- '.pointer-select-list' : ->
16
+ '.pointer-select-list': ->
17
17
  pointerContent @find('.pointer-select select').map( -> $(this).val() )
18
- '.pointer-mixed' : ->
18
+ '.pointer-mixed': ->
19
19
  element = '.pointer-checkbox-sublist input:checked,\
20
20
  .pointer-sublist-ul input'
21
21
  pointerContent @find(element).map( -> $(this).val() )
22
22
  # must happen after pointer-list-ul, I think
23
- '.perm-editor' : -> permissionsContent this
23
+ '.perm-editor': -> permissionsContent this
24
24
  }
25
-
26
25
  editorInitFunctionMap: {
27
- '.date-editor' : -> @datepicker { dateFormat : 'yy-mm-dd' }
28
- 'textarea' : -> $(this).autosize()
29
- '.ace-editor-textarea' : -> wagn.initAce $(this)
30
- '.tinymce-textarea' : -> wagn.initTinyMCE @[0].id
31
- '.pointer-list-editor' : ->
26
+ '.date-editor': -> @datepicker { dateFormat: 'yy-mm-dd' }
27
+ 'textarea': -> $(this).autosize()
28
+ '.ace-editor-textarea': -> wagn.initAce $(this)
29
+ '.tinymce-textarea': -> wagn.initTinyMCE @[0].id
30
+ '.pointer-list-editor': ->
32
31
  @sortable({handle : '.handle', cancel : ''})
33
32
  wagn.initPointerList @find('input')
34
- '.file-upload' : -> wagn.upload_file(this)
35
- '.etherpad-textarea' : ->
33
+ '.file-upload': -> wagn.upload_file(this)
34
+ '.etherpad-textarea': ->
36
35
  $(this).closest('form')
37
36
  .find('.edit-submit-button')
38
37
  .attr('class', 'etherpad-submit-button')
@@ -48,8 +47,8 @@ $.extend wagn,
48
47
  card_name = $_this.siblings(".attachment_card_name:first").attr("name")
49
48
  type_id = $_this.siblings("#attachment_type_id").val()
50
49
  data.formData = {
51
- "card[type_id]" : type_id,
52
- "attachment_upload" : card_name
50
+ "card[type_id]": type_id,
51
+ "attachment_upload": card_name
53
52
  }
54
53
  $_fileupload = $(fileupload)
55
54
  if $_fileupload.closest("form").attr("action").indexOf("update") > -1
@@ -177,8 +176,11 @@ $.extend wagn,
177
176
  # sidebars
178
177
 
179
178
  wrapDeckoLayout = () ->
180
- $('body > article, body > aside, body > footer').wrapAll('<div class="container"/>')
179
+ $footer = $('body > footer').first()
180
+ $('body > article, body > aside').wrapAll('<div class="container"/>')
181
181
  $('div.container > article, div.container > aside').wrapAll('<div class="row row-offcanvas">')
182
+ if $footer
183
+ $('body').append $footer
182
184
 
183
185
  wrapSidebarToggle = (toggle) ->
184
186
  "<div class='container'><div class='row'>#{toggle}</div></div>"
@@ -210,6 +212,7 @@ doubleSidebar = ->
210
212
  $('body').append($asideLeft).append($article).append($asideRight)
211
213
 
212
214
  wrapDeckoLayout()
215
+
213
216
  $article.prepend(wrapSidebarToggle("#{sidebarToggle('right')}#{sidebarToggle('left')}"))
214
217
 
215
218
  $(window).ready ->
@@ -316,15 +319,15 @@ $(window).ready ->
316
319
 
317
320
  # modal mod
318
321
 
319
- $('body').on 'hide.bs.modal', (event) ->
320
- $(event.target).find('.modal-dialog > .modal-content').empty()
322
+ $('body').on 'hidden.bs.modal', (event) ->
323
+ modal_content = $(event.target).find('.modal-dialog > .modal-content')
321
324
  if $(event.target).attr('id') != 'modal-main-slot'
322
325
  slot = $( event.target ).slot()
323
326
  menu_slot = slot.find '.menu-slot:first'
324
327
  url = wagn.rootPath + '/~' + slot.data('card-id')
325
328
  params = { view: 'menu' }
326
329
  params['is_main'] = true if slot.isMain()
327
-
330
+ modal_content.empty()
328
331
  $.ajax url, {
329
332
  type : 'GET'
330
333
  data: params
@@ -332,6 +335,8 @@ $(window).ready ->
332
335
  menu_slot.replaceWith data
333
336
  }
334
337
 
338
+
339
+
335
340
  # for slot in $('.card-slot')
336
341
  # menu_slot = $(slot).find '.menu-slot:first'
337
342
  # if menu_slot.size() > 0