card 1.15.7 → 1.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/card.gemspec +3 -2
  4. data/config/initializers/inflections.rb +1 -1
  5. data/db/migrate_core_cards/20150528084659_add_session_cardtype.rb +0 -1
  6. data/db/migrate_core_cards/20150601133433_add_recent_setting_session_card.rb +12 -0
  7. data/db/migrate_core_cards/20150610171702_add_debugger_session_card.rb +11 -0
  8. data/db/migrate_core_cards/20150611203506_rails_inflection_updates.rb +82 -0
  9. data/db/migrate_core_cards/20150627205133_fix_script_bootstrap_card_type.rb +7 -0
  10. data/db/migrate_core_cards/20150702130543_remove_edit_toolbar_pinned.rb +9 -0
  11. data/db/schema.rb +81 -81
  12. data/db/seed/new/card_actions.yml +12581 -1647
  13. data/db/seed/new/card_acts.yml +1 -1
  14. data/db/seed/new/card_changes.yml +39326 -7569
  15. data/db/seed/new/card_references.yml +518 -455
  16. data/db/seed/new/cards.yml +1547 -1291
  17. data/db/seed/test/fixtures/card_actions.yml +13700 -2717
  18. data/db/seed/test/fixtures/card_acts.yml +314 -272
  19. data/db/seed/test/fixtures/card_changes.yml +45409 -13573
  20. data/db/seed/test/fixtures/card_references.yml +1223 -1125
  21. data/db/seed/test/fixtures/cards.yml +2694 -2433
  22. data/db/seed/test/fixtures/file1.txt +1 -0
  23. data/db/seed/test/fixtures/file2.txt +1 -0
  24. data/db/version_core_cards.txt +1 -1
  25. data/lib/card.rb +23 -13
  26. data/lib/card/auth.rb +6 -6
  27. data/lib/card/cache.rb +24 -5
  28. data/lib/card/env.rb +10 -10
  29. data/lib/card/format.rb +29 -12
  30. data/lib/card/log.rb +5 -3
  31. data/lib/card/migration.rb +17 -41
  32. data/lib/card/name.rb +12 -0
  33. data/lib/card/reference.rb +11 -12
  34. data/lib/card/set.rb +59 -6
  35. data/lib/card/simplecov_helper.rb +6 -1
  36. data/lib/card/spec_helper.rb +3 -2
  37. data/lib/card/view_cache.rb +77 -0
  38. data/lib/cardio.rb +30 -22
  39. data/mod/01_core/format/html_format.rb +17 -9
  40. data/mod/01_core/layout/blank.html +1 -1
  41. data/mod/01_core/layout/default.html +6 -16
  42. data/mod/01_core/layout/modal.html +9 -0
  43. data/mod/01_core/layout/noside.html +5 -12
  44. data/mod/01_core/layout/simple.html +1 -1
  45. data/mod/01_core/set/all/collection.rb +57 -5
  46. data/mod/01_core/set/all/content.rb +5 -7
  47. data/mod/01_core/set/all/name.rb +8 -10
  48. data/mod/01_core/set/all/permissions.rb +1 -2
  49. data/mod/01_core/set/all/phases.rb +5 -13
  50. data/mod/01_core/set/all/references.rb +10 -10
  51. data/mod/01_core/set/all/rules.rb +2 -2
  52. data/mod/01_core/set/all/tracked_attributes.rb +5 -3
  53. data/mod/01_core/set/all/utils.rb +79 -9
  54. data/mod/01_core/set/all/view_cache.rb +9 -0
  55. data/mod/01_core/spec/format/html_format_spec.rb +2 -2
  56. data/mod/01_core/spec/set/all/collection_spec.rb +1 -1
  57. data/mod/01_history/lib/card/act.rb +3 -1
  58. data/mod/01_history/lib/card/action.rb +20 -12
  59. data/mod/01_history/lib/card/change.rb +12 -8
  60. data/mod/01_history/set/all/actions.rb +2 -2
  61. data/mod/01_history/set/all/content_history.rb +3 -2
  62. data/mod/01_history/set/all/history.rb +57 -19
  63. data/mod/02_basic_types/set/all/rss.rb +5 -6
  64. data/mod/{05_standard → 02_basic_types}/set/type/html.rb +4 -3
  65. data/mod/02_basic_types/set/type/plain_text.rb +1 -1
  66. data/mod/02_basic_types/set/type/pointer.rb +7 -4
  67. data/mod/02_basic_types/spec/set/type/pointer_spec.rb +21 -17
  68. data/mod/03_machines/lib/card/machine.rb +33 -31
  69. data/mod/03_machines/lib/javascript/script_card_menu.js.coffee +2 -10
  70. data/mod/03_machines/lib/javascript/wagn.js.coffee +10 -10
  71. data/mod/03_machines/lib/javascript/wagn_mod.js.coffee +87 -40
  72. data/mod/03_machines/lib/stylesheets/style_cards.scss +26 -28
  73. data/mod/03_machines/set/right/machine_output.rb +3 -3
  74. data/mod/03_machines/set/type/coffee_script.rb +6 -6
  75. data/mod/03_machines/set/type/css.rb +1 -1
  76. data/mod/03_machines/set/type/java_script.rb +5 -6
  77. data/mod/03_machines/spec/lib/shared_machine_examples.rb +3 -1
  78. data/mod/03_machines/spec/set/type/scss_spec.rb +9 -10
  79. data/mod/04_settings/lib/card/setting.rb +16 -14
  80. data/mod/04_settings/set/right/structure.rb +6 -0
  81. data/mod/04_settings/set/self/add_help.rb +1 -1
  82. data/mod/04_settings/set/self/autoname.rb +1 -1
  83. data/mod/04_settings/set/self/captcha.rb +1 -1
  84. data/mod/04_settings/set/self/default.rb +1 -1
  85. data/mod/04_settings/set/self/help.rb +1 -1
  86. data/mod/04_settings/set/self/input.rb +1 -1
  87. data/mod/04_settings/set/self/layout.rb +1 -1
  88. data/mod/04_settings/set/self/on_create.rb +1 -1
  89. data/mod/04_settings/set/self/on_delete.rb +1 -1
  90. data/mod/04_settings/set/self/on_update.rb +1 -1
  91. data/mod/04_settings/set/self/options.rb +1 -1
  92. data/mod/04_settings/set/self/options_label.rb +1 -1
  93. data/mod/04_settings/set/self/script.rb +1 -1
  94. data/mod/04_settings/set/self/structure.rb +1 -1
  95. data/mod/04_settings/set/self/style.rb +1 -1
  96. data/mod/04_settings/set/self/table_of_contents.rb +1 -1
  97. data/mod/04_settings/set/self/thanks.rb +1 -1
  98. data/mod/05_email/set/all/follow.rb +3 -21
  99. data/mod/05_email/set/all/notify.rb +20 -4
  100. data/mod/05_email/set/right/follow.rb +16 -18
  101. data/mod/05_email/set/self/follow.rb +1 -1
  102. data/mod/05_email/spec/set/all/follow_spec.rb +6 -13
  103. data/mod/05_standard/set/all/attach.rb +23 -9
  104. data/mod/05_standard/set/all/error.rb +5 -7
  105. data/mod/05_standard/set/all/event_viz.rb +10 -6
  106. data/mod/05_standard/set/all/links.rb +37 -13
  107. data/mod/05_standard/set/all/rich_html/content.rb +46 -18
  108. data/mod/05_standard/set/all/rich_html/editing.rb +29 -25
  109. data/mod/05_standard/set/all/rich_html/form.rb +17 -10
  110. data/mod/05_standard/set/all/rich_html/header.rb +26 -4
  111. data/mod/05_standard/set/all/rich_html/menu.rb +17 -34
  112. data/mod/05_standard/set/all/rich_html/modal.rb +50 -12
  113. data/mod/05_standard/set/all/rich_html/toolbar.rb +178 -186
  114. data/mod/05_standard/set/all/rich_html/wrapper.rb +44 -21
  115. data/mod/05_standard/set/rstar/rules.rb +43 -53
  116. data/mod/05_standard/set/self/all.rb +2 -1
  117. data/mod/05_standard/set/self/head.rb +2 -2
  118. data/mod/05_standard/set/self/signin.rb +18 -18
  119. data/mod/05_standard/set/self/stats.rb +14 -2
  120. data/mod/05_standard/set/type/search_type.rb +9 -4
  121. data/mod/05_standard/set/type/session.rb +12 -7
  122. data/mod/05_standard/set/type/set.rb +135 -18
  123. data/mod/05_standard/spec/chunk/include_spec.rb +15 -16
  124. data/mod/05_standard/spec/set/all/account_spec.rb +21 -21
  125. data/mod/05_standard/spec/set/all/event_viz_spec.rb +7 -7
  126. data/mod/05_standard/spec/set/all/history_spec.rb +54 -24
  127. data/mod/05_standard/spec/set/all/rich_html/editing_spec.rb +42 -40
  128. data/mod/05_standard/spec/set/rstar/rules_spec.rb +1 -1
  129. data/mod/05_standard/spec/set/type/search_type_spec.rb +9 -1
  130. data/mod/05_standard/spec/set/type/signup_spec.rb +42 -42
  131. data/mod/06_bootstrap/lib/stylesheets/bootstrap_cards.scss +6 -0
  132. data/mod/06_bootstrap/set/all/bootstrap/form.rb +4 -5
  133. data/mod/06_bootstrap/set/all/bootstrap/helper.rb +145 -0
  134. data/mod/06_bootstrap/set/all/rich_bootstrap.rb +0 -59
  135. data/spec/lib/card/action_spec.rb +1 -1
  136. data/spec/lib/card/log_spec.rb +7 -7
  137. data/spec/models/card/cardtype_spec.rb +1 -1
  138. data/spec/spec_helper.rb +1 -1
  139. metadata +31 -6
  140. data/mod/04_settings/set/self/comment.rb +0 -2
@@ -0,0 +1,9 @@
1
+ <div class="modal-header clearfix">
2
+ {{_|modal_menu}}
3
+ </div>
4
+ <div class="modal-body ">
5
+ {{_main}}
6
+ </div>
7
+ <div class="modal-footer">
8
+ {{_|modal_footer}}
9
+ </div>
@@ -1,16 +1,9 @@
1
1
  <!DOCTYPE HTML>
2
2
  <html>
3
- <head>
4
- {{*head}}
5
- </head>
6
-
7
- <body id="wagn" class="noside">
8
- <div id="menu">
9
- [[/ | Home]] [[/recent | Recent]] {{*navbox}} {{*account links}}
10
- </div>
11
-
12
- <div>
13
- {{_main}}
14
- </div>
3
+ <head>{{*head|core}}</head>
4
+ <body>
5
+ <header>{{*header|core}}</header>
6
+ <article>{{_main|open}}</article>
7
+ <footer>{{*footer|core}}</footer>
15
8
  </body>
16
9
  </html>
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE HTML>
2
2
  <html>
3
- <head> {{*head}} </head>
3
+ <head> {{*head|core}} </head>
4
4
  <body> {{_main}} </body>
5
5
  </html>
@@ -48,6 +48,12 @@ def item_type
48
48
  nil
49
49
  end
50
50
 
51
+ def item_keys args={}
52
+ item_names(args).map do |item|
53
+ item.to_name.key
54
+ end
55
+ end
56
+
51
57
  def include_item? item
52
58
  key = if Card === item
53
59
  item.cardname.key
@@ -177,15 +183,57 @@ format do
177
183
  end
178
184
 
179
185
 
180
- def each_nest args={}
181
- Card::Content.new(card.content, card).find_chunks( Card::Chunk::Reference ).each do |chunk|
186
+ def each_reference_with_args args={}
187
+ Card::Content.new(_render_raw(args), card).find_chunks( Card::Chunk::Reference ).each do |chunk|
182
188
  yield(chunk.referee_name.to_s, nest_args(args,chunk))
183
189
  end
184
190
  end
185
191
 
186
- def map_nests args={}, &block
192
+
193
+ def each_nested_chunk args={}
194
+ Card::Content.new(_render_raw(args), card).find_chunks( Card::Chunk::Include).each do |chunk|
195
+ yield(chunk) if chunk.referee_name # filter commented nests
196
+ end
197
+ end
198
+
199
+
200
+ def nested_fields args={}
201
+ result = []
202
+ each_nested_field(args) do |chunk|
203
+ result << chunk
204
+ end
205
+ result
206
+ end
207
+
208
+ def unique_chunks chunk, processed_set, &block
209
+ if !processed_set.include? chunk.referee_name.key
210
+ processed_set << chunk.referee_name.key
211
+ block.call(chunk)
212
+ end
213
+ end
214
+
215
+ def each_nested_field args, &block
216
+ processed_chunk_keys = ::Set.new([card.key])
217
+
218
+ each_nested_chunk(args) do |chunk|
219
+ # TODO handle structures that are non-virtual
220
+ if chunk.referee_name.to_name.is_a_field_of? card.name
221
+ if chunk.referee_card && chunk.referee_card.virtual? && !processed_chunk_keys.include?(chunk.referee_name.key)
222
+ processed_chunk_keys << chunk.referee_name.key
223
+ subformat(chunk.referee_card).each_nested_field(args) do |sub_chunk|
224
+ unique_chunks sub_chunk, processed_chunk_keys, &block
225
+ end
226
+ else
227
+ unique_chunks chunk, processed_chunk_keys, &block
228
+ end
229
+ end
230
+ end
231
+
232
+ end
233
+
234
+ def map_references_with_args args={}, &block
187
235
  result = []
188
- each_nest args do |name, n_args|
236
+ each_reference_with_args args do |name, n_args|
189
237
  result << block.call(name, n_args)
190
238
  end
191
239
  result
@@ -210,11 +258,15 @@ end
210
258
 
211
259
 
212
260
  format :html do
261
+ view :count do |args|
262
+ card.item_names(args).size
263
+ end
264
+
213
265
  view :tabs do |args|
214
266
  tab_buttons = ''
215
267
  tab_panes = ''
216
268
  active_tab = true
217
- each_nest(:item=>:content) do |name, nest_args|
269
+ each_reference_with_args(:item=>:content) do |name, nest_args|
218
270
  id = "#{card.cardname.safe_key}-#{name.to_name.safe_key}"
219
271
  url = nest_path name, nest_args
220
272
  tab_name = nest_args[:title] || name
@@ -12,7 +12,6 @@ def raw_content
12
12
  structure ? template.db_content : content
13
13
  end
14
14
 
15
-
16
15
  format do
17
16
  def chunk_list #override to customize by set
18
17
  :default
@@ -35,6 +34,10 @@ def clean_html?
35
34
  true
36
35
  end
37
36
 
37
+ def history?
38
+ false
39
+ end
40
+
38
41
  def save_content_draft content
39
42
  clear_drafts
40
43
  end
@@ -51,14 +54,9 @@ event :save_draft, :before=>:store, :on=>:update, :when=>proc{ |c| Env.params['d
51
54
  end
52
55
 
53
56
 
54
- event :set_default_content, :on=>:create, :before=>:approve do
57
+ event :set_default_content, :on=>:create, :before=>:approve do
55
58
  if !db_content_changed? and template and template.db_content.present?
56
59
  self.db_content = template.db_content
57
60
  end
58
61
  end
59
62
 
60
- event :detect_conflict, :before=>:approve, :on=>:update do
61
- if last_action_id_before_edit and last_action_id_before_edit.to_i != last_action_id and last_action.act.actor_id != Auth.current_id
62
- errors.add :conflict, "changes not based on latest revision"
63
- end
64
- end
@@ -8,20 +8,20 @@ def name= newname
8
8
  @superleft = @supercard if relparts.size==2 && relparts.first.blank?
9
9
  cardname = @relative_name.to_name.to_absolute_name @supercard.name
10
10
  end
11
-
11
+
12
12
  newkey = cardname.key
13
13
  if key != newkey
14
14
  self.key = newkey
15
15
  reset_patterns_if_rule # reset the old name - should be handled in tracked_attributes!!
16
16
  reset_patterns
17
17
  end
18
-
18
+
19
19
  subcards.each do |subkey, subcard|
20
20
  next unless Card===subcard
21
21
  subcard.name = subkey.to_name.to_absolute cardname
22
22
  end
23
-
24
- super cardname.s
23
+
24
+ write_attribute :name, cardname.s
25
25
  end
26
26
 
27
27
  def cardname
@@ -55,7 +55,7 @@ def left *args
55
55
  @superleft or begin
56
56
  unless name_changed? and name.to_name.trunk_name.key == name_was.to_name.key
57
57
  # prevent recursion when, eg, renaming A+B to A+B+C
58
- Card.fetch cardname.left, *args
58
+ Card.fetch cardname.left, *args
59
59
  end
60
60
  end
61
61
  end
@@ -140,11 +140,11 @@ end
140
140
 
141
141
  event :validate_unique_codename, :after=>:permit_codename do
142
142
  if codename.present? and errors.empty? and Card.find_by_codename(codename).present?
143
- errors.add :codename, "codename #{codename} already in use"
143
+ errors.add :codename, "codename #{codename} already in use"
144
144
  end
145
145
  end
146
146
 
147
- event :validate_name, :before=>:approve, :on=>:save do
147
+ event :validate_name, :before=>:approve, :on=>:save do
148
148
  cdname = name.to_name
149
149
  if name.length > 255
150
150
  errors.add :name, "is too long (255 character maximum)"
@@ -168,7 +168,7 @@ event :validate_name, :before=>:approve, :on=>:save do
168
168
  condition_sql << " AND cards.id <> ?"
169
169
  condition_params << id
170
170
  end
171
- if c = Card.find(:first, :conditions=>[condition_sql, *condition_params])
171
+ if c = Card.find_by(condition_sql, *condition_params)
172
172
  errors.add :name, "must be unique; '#{c.name}' already exists."
173
173
  end
174
174
  end
@@ -233,7 +233,6 @@ end
233
233
 
234
234
 
235
235
  event :cascade_name_changes, :after=>:store, :on=>:update, :changed=>:name do
236
-
237
236
  Rails.logger.debug "-------------------#{name_was}- CASCADE #{self.name} -------------------------------------"
238
237
 
239
238
  self.update_referencers = false if self.update_referencers == 'false' #handle strings from cgi
@@ -252,7 +251,6 @@ event :cascade_name_changes, :after=>:store, :on=>:update, :changed=>:name do
252
251
  Card::Reference.update_on_rename dep, newname, update_referencers
253
252
  Card.expire newname
254
253
  end
255
-
256
254
  if update_referencers
257
255
  Auth.as_bot do
258
256
  [self.name_referencers(name_was)+(deps.map &:referencers)].flatten.uniq.each do |card|
@@ -76,7 +76,6 @@ def permitted? action
76
76
  return true if action != :comment and Auth.always_ok?
77
77
 
78
78
  permitted_ids = who_can action
79
-
80
79
  if action == :comment && Auth.always_ok?
81
80
  # admin can comment if anyone can
82
81
  !permitted_ids.empty?
@@ -87,6 +86,7 @@ def permitted? action
87
86
  end
88
87
 
89
88
  def permit action, verb=nil
89
+
90
90
  if Card.config.read_only # not called by ok_to_read
91
91
  deny_because "Currently in read-only mode"
92
92
  end
@@ -199,7 +199,6 @@ event :check_permissions, :after=>:approve do
199
199
  else
200
200
  @action
201
201
  end
202
-
203
202
  track_permission_errors do
204
203
  ok? task
205
204
  end
@@ -69,24 +69,13 @@ def identify_action
69
69
  end
70
70
  end
71
71
 
72
- def store_changes
73
- @changed_fields = Card::TRACKED_FIELDS.select{ |f| changed_attributes.member? f }
74
- return unless @current_action
75
- if @changed_fields.present?
76
- @current_action.changed_fields(self, @changed_fields)
77
- elsif @current_action and @current_action.changes.empty?
78
- @current_action.delete
79
- end
80
- end
81
-
82
-
83
72
 
84
73
  def store
85
74
  run_callbacks :store do
86
75
  yield #unless @draft
87
- store_changes
88
76
  @virtual = false
89
77
  end
78
+ run_callbacks :stored
90
79
  rescue =>e
91
80
  rescue_event e
92
81
  ensure
@@ -96,6 +85,7 @@ end
96
85
 
97
86
  def extend
98
87
  run_callbacks :extend
88
+ run_callbacks :subsequent
99
89
  rescue =>e
100
90
  rescue_event e
101
91
  ensure
@@ -103,6 +93,8 @@ ensure
103
93
  end
104
94
 
105
95
 
96
+
97
+
106
98
  def rescue_event e
107
99
  @action = nil
108
100
  expire_pieces
@@ -149,7 +141,7 @@ event :process_subcards, :after=>:approve, :on=>:save do
149
141
  opts['subcards'] = extract_subcard_args! opts
150
142
 
151
143
  opts[:supercard] = self
152
-
144
+
153
145
  subcard = if known_card = Card[ab_name]
154
146
  known_card.refresh.assign_attributes opts
155
147
  known_card
@@ -1,7 +1,7 @@
1
1
 
2
2
  def name_referencers link_name=nil
3
3
  link_name = link_name.nil? ? key : link_name.to_name.key
4
- Card.all :joins => :references_to, :conditions => { :card_references => { :referee_key => link_name } }
4
+ Card.joins( :references_to ).where card_references: { referee_key: link_name }
5
5
  end
6
6
 
7
7
  def extended_referencers
@@ -11,7 +11,7 @@ end
11
11
 
12
12
  def replace_references old_name, new_name
13
13
  obj_content = Card::Content.new raw_content, card=self
14
-
14
+
15
15
  obj_content.find_chunks( Card::Chunk::Reference ).select do |chunk|
16
16
  if old_ref_name = chunk.referee_name and new_ref_name = old_ref_name.replace_part(old_name, new_name)
17
17
  chunk.referee_name = chunk.replace_reference old_name, new_name
@@ -31,28 +31,28 @@ def update_references rendered_content = nil, refresh = false
31
31
  #Card.update( id, :references_expired=>nil )
32
32
  # or just this and save it elsewhere?
33
33
  #references_expired=nil
34
-
35
- connection.execute("update cards set references_expired=NULL where id=#{id}")
34
+
35
+ Card.connection.execute("update cards set references_expired=NULL where id=#{id}")
36
36
  # references_expired = nil
37
37
  expire if refresh
38
38
 
39
39
  rendered_content ||= Card::Content.new(raw_content, card=self)
40
-
40
+
41
41
  rendered_content.find_chunks(Card::Chunk::Reference).each do |chunk|
42
42
  if referee_name = chunk.referee_name # name is referenced (not true of commented inclusions)
43
- referee_id = chunk.referee_id
43
+ referee_id = chunk.referee_id
44
44
  if id != referee_id # not self reference
45
-
45
+
46
46
  #update_references chunk.referee_name if Card::Content === chunk.referee_name
47
47
  # for the above to work we will need to get past delete_all!
48
48
  referee_name.piece_names.each do |name|
49
49
  if name.key != key # don't create self reference
50
-
50
+
51
51
  # reference types:
52
52
  # L = link
53
53
  # I = inclusion
54
54
  # P = partial (i.e. the name is part of a compound name that is referenced by a link or inclusion)
55
- # The partial type is needed to keep track of references of virtual cards.
55
+ # The partial type is needed to keep track of references of virtual cards.
56
56
  # For example a link [[A+*self]] won't make it to the reference table because A+*self is virtual and
57
57
  # doesn't have an id but when A's name is changed we have to find and update that link.
58
58
  ref_type = if name == referee_name
@@ -70,7 +70,7 @@ def update_references rendered_content = nil, refresh = false
70
70
  end
71
71
  end
72
72
  end
73
-
73
+
74
74
  end
75
75
  end
76
76
  end
@@ -69,12 +69,12 @@ def rule_card_id setting_code, options={}
69
69
  nil
70
70
  end
71
71
 
72
- def related_sets
72
+ def related_sets with_self = false
73
73
  # refers to sets that users may configure from the current card - NOT to sets to which the current card belongs
74
74
 
75
75
  sets = []
76
76
  sets << ["#{name}+*type", Card::TypeSet.label( name) ] if known? && type_id==Card::CardtypeID
77
- #sets << ["#{name}+*self", Card::SelfSet.label( name) ]
77
+ sets << ["#{name}+*self", Card::SelfSet.label( name) ] if with_self
78
78
  sets << ["#{name}+*right", Card::RightSet.label(name) ] if known? && cardname.simple?
79
79
 
80
80
  # Card.search(:type=>'Set',:left=>{:right=>name},:right=>'*type plus right',:return=>'name').each do |set_name|
@@ -1,5 +1,5 @@
1
1
  #fixme -this is called by both initialize and update_attributes. really should be optimized for new!
2
- def assign_attributes args={}, options={}
2
+ def assign_attributes args={}
3
3
  if args
4
4
  args = args.stringify_keys
5
5
  if newtype = args.delete('type')
@@ -8,7 +8,9 @@ def assign_attributes args={}, options={}
8
8
  @subcards = extract_subcard_args! args
9
9
  reset_patterns
10
10
  end
11
- super args, options
11
+ params = ActionController::Parameters.new(args)
12
+ params.permit!
13
+ super params
12
14
  end
13
15
 
14
16
  def extract_subcard_args! args={}
@@ -43,7 +45,7 @@ event :update_ruled_cards, :after=>:store do
43
45
  self.class.clear_rule_cache
44
46
  set = rule_set
45
47
  set.reset_set_patterns
46
-
48
+
47
49
  if right_id==Card::ReadID and (name_changed? or trash_changed?)
48
50
  self.class.clear_read_rule_cache
49
51
  Card.cache.reset # maybe be more surgical, just Auth.user related
@@ -1,6 +1,6 @@
1
1
 
2
2
  module ClassMethods
3
-
3
+
4
4
  def empty_trash
5
5
  Card.delete_trashed_files
6
6
  Card.where(:trash=>true).delete_all
@@ -8,7 +8,7 @@ module ClassMethods
8
8
  Card::Reference.repair_missing_referees
9
9
  Card::Reference.delete_missing_referers
10
10
  end
11
-
11
+
12
12
  def delete_trashed_files #deletes any file not associated with a real card.
13
13
  dir = Card.paths['files'].existent.first
14
14
  trashed_card_sql = %{ select id from cards where trash is true }
@@ -21,7 +21,7 @@ module ClassMethods
21
21
  end
22
22
  end
23
23
  end
24
-
24
+
25
25
  def merge_list attribs, opts={}
26
26
  unmerged = []
27
27
  attribs.each do |row|
@@ -33,7 +33,7 @@ module ClassMethods
33
33
  end
34
34
  unmerged.push row unless result == true
35
35
  end
36
-
36
+
37
37
  if unmerged.empty?
38
38
  Rails.logger.info "successfully merged all!"
39
39
  else
@@ -47,13 +47,13 @@ module ClassMethods
47
47
  end
48
48
  end
49
49
  unmerged
50
- end
51
-
52
-
50
+ end
51
+
52
+
53
53
  def merge name, attribs={}, opts={}
54
54
  puts "merging #{ name }"
55
55
  card = fetch name, :new=>{}
56
-
56
+
57
57
  if opts[:pristine] && !card.pristine?
58
58
  false
59
59
  else
@@ -61,7 +61,7 @@ module ClassMethods
61
61
  card.save!
62
62
  end
63
63
  end
64
-
64
+
65
65
  end
66
66
 
67
67
  def debug_type
@@ -84,3 +84,73 @@ def inspect
84
84
  '>'
85
85
  end
86
86
 
87
+ format :html do
88
+ view :views_by_format do |args|
89
+ format_views = self.class.ancestors.each_with_object({}) do |format_class, hash|
90
+ views =
91
+ format_class.instance_methods.map do |method|
92
+ if method.to_s.match /^_view_(.+)$/
93
+ "<li>#{$1}</li>"
94
+ end
95
+ end.compact.join "\n"
96
+ if views.present?
97
+ format_class.name.match /^Card(::Set)?::(.+?)$/ #::(\w+Format)
98
+ hash[$2] = views
99
+ end
100
+ end
101
+ accordion_group format_views
102
+ end
103
+
104
+ view :views_by_name do |args|
105
+ views = methods.map do |method|
106
+ if method.to_s.match /^_view_(.+)$/
107
+ $1
108
+ end
109
+ end.compact.sort
110
+ "<ul>
111
+ #{ wrap_each_with :li, views }
112
+ </ul>"
113
+ end
114
+
115
+
116
+
117
+
118
+ def accordion_group list, collapse_id=card.cardname.safe_key
119
+ accordions = ''
120
+ index = 1
121
+ list.each_pair do |title, content|
122
+ accordions << accordion(title, content, "#{collapse_id}-#{index}")
123
+ index += 1
124
+ end
125
+ content_tag :div, accordions.html_safe, :class=>"panel-group", :id=>"accordion-#{collapse_id}", :role=>"tablist", 'aria-multiselectable'=>"true"
126
+ end
127
+
128
+ def accordion title, content, collapse_id=card.cardname.safe_key
129
+ panel_body =
130
+ case content
131
+ when Hash
132
+ accordion_group accordion(content, collapse_id)
133
+ when Array
134
+ content.join "\n"
135
+ else
136
+ content
137
+ end
138
+ %{
139
+ <div class="panel panel-default">
140
+ <div class="panel-heading" role="tab" id="heading-#{collapse_id}">
141
+ <h4 class="panel-title">
142
+ <a data-toggle="collapse" data-parent="#accordion-#{collapse_id}" href="##{collapse_id}" aria-expanded="true" aria-controls="#{collapse_id}">
143
+ #{ title }
144
+ </a>
145
+ </h4>
146
+ </div>
147
+ <div id="#{collapse_id}" class="panel-collapse collapse" role="tabpanel" aria-labelledby="heading-#{collapse_id}">
148
+ <div class="panel-body">
149
+ #{ panel_body }
150
+ </div>
151
+ </div>
152
+ </div>
153
+ }.html_safe
154
+ end
155
+ end
156
+