parlement 0.4 → 0.5

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.
data/CHANGES CHANGED
@@ -1,5 +1,13 @@
1
1
  - parlement changelog
2
2
 
3
+ == Version 0.5
4
+
5
+ Voting. Mails containing -1, 0 or +1 trigger a vote
6
+
7
+ * correct charset decoding when receiving a mail
8
+ * better ul li previews and proposals
9
+
10
+
3
11
  == Version 0.4
4
12
 
5
13
  Evolutions and corrections
@@ -16,6 +24,7 @@ Evolutions and corrections
16
24
  * simplifications for w3m display
17
25
  * yahoo and google footers now hidden
18
26
 
27
+
19
28
  == Version 0.3
20
29
 
21
30
  Major version, adding the possibility to use not only the web forums, but mails
data/README CHANGED
@@ -65,9 +65,15 @@ Parameters
65
65
  - votes
66
66
 
67
67
 
68
- Here is my console code to reset threads from their original mails:
69
-
68
+ # Here is my console code to reset threads from their original mails:
70
69
  >> elts=Mail.find_all.select{|m|m.file and mail=TMail::Mail.parse(m.file) and reply=mail.in_reply_to and mailObject=Mail.find_by_message(reply) and mailObject.elt.id!=m.elt.parent_id}.collect{|m| {:elt=>m.elt.id, :parent=>Mail.find_by_message(TMail::Mail.parse(m.file).in_reply_to).elt.id}}; puts elts.size
71
-
72
70
  >> elts.each{|e|print e[:elt], ' ', e[:parent], ' '; puts Elt.update_all("parent_id='#{e[:parent]}'", "id='#{e[:elt]}'")}; puts elts.size
73
71
 
72
+ # To get duplicate messages
73
+ >> messages=Mail.find_by_sql "select message from mails group by message having count(message) > 1"; puts messages.length
74
+ >> messages.each{ |m| mail=Mail.find_all_by_message m.message; mail.each{|m| print m.elt.id, ' ', m.elt.subject, ' ', m.elt.children.size; puts } }; puts messages.length
75
+
76
+ # To get all existing votes
77
+ elts=Elt.find(:all, :conditions => ["body LIKE '%%+1%%' OR body LIKE '%%0%%' OR body LIKE '%%-1%%'"]); puts elts.size
78
+ elts.each { |e| print '(', Regexp.last_match(1), ')' if e.body =~ /^\s*(-1|0|\+1)(\s*|$)/ }; puts; puts elts.size
79
+ elts.each { |e| e.vote(Regexp.last_match(1), e.person) if e.body =~ /^\s*(-1|0|\+1)(\s*|$)/ }; puts; puts elts.size
@@ -11,13 +11,13 @@ module EltHelper
11
11
  # 1. numbered list
12
12
  # short lines to which are added a break
13
13
  text = auto_link data \
14
- .gsub(/(wrote:.*)$(\n)^>\s/, '\\1<br/>\\2\\2> ') \
14
+ .gsub(/^\b(.*:)$(\n)^>\s/, '\\1<br/>\\2\\2> ') \
15
15
  .gsub(/^Yahoo! Groups Links$(\n{2}^<*.*$\s.*$)*/, '') \
16
16
  .gsub(/^[-~]*$\n^You.*$\n^To.*$\n^To.*$\n^For more.*$\n^[-~]*$/, '') \
17
17
  .gsub(/(\s+)\/([\w\s]*)\//, '\\1_\\2_') \
18
18
  .gsub(/^-\s/, '* ') \
19
19
  .gsub(/^\d+[\.-]\s+/, '# ') \
20
- .gsub(/^\s*\b(.{2,50})$(\n)\b/, '\\1<br/>\\2') \
20
+ .gsub(/^\b(.{2,50})$(\n)\b/, '\\1<br/>\\2') \
21
21
  if data != nil
22
22
 
23
23
  textiled = text.blank? ? "" : RedCloth.new(text)
@@ -1,13 +1,12 @@
1
1
  #
2
- # Receive an email from which an elt is created.
2
+ # Receive an email from which a model Mail is created.
3
3
  #
4
- # An associated mail is kept to make sure we don't lose any data. Attachments
5
- # are also created in an associated table
4
+ # An associated Elt is generated. Attachments are also created in an associated
5
+ # table
6
6
  #
7
7
  class Mailman < ActionMailer::Base
8
8
  def receive(email)
9
- elt = Elt.new
10
- elt.receive(email)
9
+ Mail.receive email
11
10
  end
12
11
  end
13
12
 
@@ -0,0 +1,4 @@
1
+ class Choice < ActiveRecord::Base
2
+ belongs_to :person
3
+ belongs_to :elt
4
+ end
data/app/models/elt.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  #
2
2
  # This is, in fact, the main parlement class!
3
3
  #
4
+ # It holds all posts, that's mostly a subject and a body, plus their
5
+ # relationships in a tree of elements
6
+ #
4
7
  class Elt < ActiveRecord::Base
5
8
  usesguid
6
9
 
@@ -11,9 +14,10 @@ class Elt < ActiveRecord::Base
11
14
 
12
15
  belongs_to :person
13
16
 
14
- has_and_belongs_to_many :subscribers,
15
- :class_name => "Person",
16
- :join_table => "subscribers"
17
+ has_and_belongs_to_many :subscribers, :class_name => "Person", :join_table => "subscribers"
18
+
19
+ has_many :choices
20
+ has_many :voters, :through => :choices, :source => :person
17
21
 
18
22
  # for live_tree
19
23
  def name
@@ -22,59 +26,43 @@ class Elt < ActiveRecord::Base
22
26
 
23
27
  # Just a quick method to get all subscribers as a simple list
24
28
  def all_recipients
25
- result = Array.new
26
- eltRecipient = self
27
- while eltRecipient
28
- result.concat eltRecipient.subscribers
29
- eltRecipient = eltRecipient.parent
29
+ if parent
30
+ (subscribers + parent.all_recipients).uniq
31
+ else
32
+ subscribers
30
33
  end
31
- logger.debug "all_recipients result: #{result.to_s}"
32
- return result
33
34
  end
34
35
 
35
- #
36
- # Receive this new elt as an email, sent through app/helpers/mailman.rb
37
- #
38
- def receive(mail)
39
- logger.info "Receive \"#{mail.subject}\""
36
+ alias_method :simple_save, :save
40
37
 
41
- # TODO
42
- # Loop detection, will need more work
43
- mail1 = Mail.find_by_message(mail.message_id)
44
- # The to_s seems necessary
45
- mail2 = Mail.find_by_message(mail['X-Message-Id'].to_s) if mail['X-Message-Id']
38
+ # Save, publish and vote this elt
39
+ def save
40
+ publish
41
+ simple_save
42
+ vote
43
+ end
46
44
 
47
- if not mail1 and not mail2
48
- self.mail = Mail.new if not self.mail
49
- self.mail.elt = self
50
- self.mail.receive(mail)
51
- self.id = mail['X-Leparlement-Elt-Id'].to_s if mail['X-Leparlement-Elt-Id']
52
- save
53
- else
54
- logger.info "Already received (id: #{mail.message_id})...\n"
55
- end
45
+ def vote(value = 1, person = self.person)
46
+ logger.info "#{person.name if person} vote #{value} on #{subject} #{self.choices}"
47
+ choices.each{ |c| logger.info c if c.person == person; c.destroy if c.person == person }
48
+ choice = choices.build :value => value, :person => person
49
+ choice.save!
56
50
  end
57
51
 
58
- #
59
- # Save and publish this elt
60
- #
61
- def save
62
- super
63
- publish
64
- logger.info "\n"
52
+ # Get the vote results
53
+ def result(electoralList = nil)
54
+ (Choice.count("elt_id = '#{self.id}' AND value = 1") \
55
+ - \
56
+ Choice.count("elt_id = '#{self.id}' AND value = -1"))
65
57
  end
66
58
 
67
59
  private
68
60
 
69
- #
70
- # Mail the elt to all subscribers
71
- #
61
+ # Mail this elt to all subscribers
72
62
  def publish
73
63
  logger.info "Publish #{subject}"
74
- self.mail ||= Mail.new
75
- self.mail.elt = self
76
- self.mail.publish
77
- self.mail.save
64
+ build_mail(:elt => self) unless mail
65
+ mail.publish
78
66
  end
79
67
  end
80
68
 
data/app/models/mail.rb CHANGED
@@ -9,7 +9,26 @@ class Mail < ActiveRecord::Base
9
9
 
10
10
  belongs_to :elt
11
11
 
12
+ #
13
+ # Receive this new elt as an email, sent through app/helpers/mailman.rb
14
+ #
15
+ # TODO
16
+ # Loop detection, will need more work
17
+ #
18
+ def Mail.receive(mail)
19
+ logger.info "Receive \"#{mail.subject}\""
12
20
 
21
+ if Mail.find_by_message(mail.message_id) \
22
+ or (mail['X-Message-Id'] \
23
+ and Mail.find_by_message(mail['X-Message-Id'].to_s))
24
+ logger.info "Already received (id: #{mail.message_id})...\n"
25
+
26
+ else
27
+ m = Mail.new
28
+ m.receive mail
29
+ m
30
+ end
31
+ end
13
32
 
14
33
  """ _
15
34
  _ __ ___ ___ ___(_)_ _____
@@ -27,27 +46,34 @@ class Mail < ActiveRecord::Base
27
46
  #
28
47
  def receive(mail)
29
48
  logger.info "Receive mail #{mail.message_id}"
30
- elt.created_on = mail.date
31
- elt.subject = unquote(mail.subject)
32
-
33
- elt.body = ''
49
+ if mail['X-Leparlement-Elt-Id'] then
50
+ build_elt :id => mail['X-Leparlement-Elt-Id'].to_s,
51
+ :created_on => mail.date,
52
+ :subject => unquote(mail.subject),
53
+ :body => '',
54
+ :mail => self
55
+ else
56
+ build_elt :created_on => mail.date,
57
+ :subject => unquote(mail.subject),
58
+ :body => '',
59
+ :mail => self
60
+ end
34
61
 
35
- elt.person = Person.find_by_email(mail.from)
36
- elt.person = Person.find_by_name(unquote(mail.friendly_from)) if not elt.person
37
- elt.person = Person.new if not elt.person
38
- elt.person.name = unquote(mail.friendly_from)
62
+ elt.person = Person.find_by_email(mail.from) \
63
+ || Person.find_by_name(unquote(mail.friendly_from)) \
64
+ || elt.build_person
65
+ elt.person.name = unquote mail.friendly_from
39
66
  elt.person.email = mail.from.first
40
67
 
41
68
  # Try to find its mail parent in the db
42
- if mail.in_reply_to
43
- m = Mail.find_by_message(mail.in_reply_to)
44
- elt.parent = m.elt if m
69
+ if mail.in_reply_to and Mail.find_by_message mail.in_reply_to
70
+ elt.parent_id = mail.in_reply_to
45
71
  end
46
72
 
47
73
  # Try to find its mail parent in the db
48
74
  if not elt.parent and mail.references
49
75
  for parent in mail.references
50
- m = Mail.find_by_message(parent.to_s)
76
+ m = Mail.find_by_message parent.to_s
51
77
  elt.parent = m.elt if m
52
78
  end
53
79
  end
@@ -58,40 +84,40 @@ class Mail < ActiveRecord::Base
58
84
  if not elt.parent and elt.subject.match(/\[[\w-]*\]/)
59
85
  parentId = elt.subject.match(/\[[\w-]*\]/)
60
86
  parentId = parentId[0].gsub(/[\[\]]/, '') if parentId
61
-
62
- elt.parent = Elt.find(parentId)
87
+ elt.parent = Elt.find parentId
63
88
  end
64
89
 
65
90
  # No reference matching an existing parent, let's try the "to" field
66
91
  to = mail["Envelope-to"].to_s + ', ' + mail.to.to_s
67
- if not elt.parent and to.match(/\w*@#{ActionMailer::Base.server_settings[:domain]}/)
68
- parentId = to.match(/\w*@#{ActionMailer::Base.server_settings[:domain]}/)[0] \
92
+ if not elt.parent and to.match(/[\w-]*@#{ActionMailer::Base.server_settings[:domain]}/)
93
+ parentId = to.match(/[\w-]*@#{ActionMailer::Base.server_settings[:domain]}/)[0] \
69
94
  .gsub(/@#{ActionMailer::Base.server_settings[:domain]}/, '')
70
-
71
- elt.parent = Elt.find(parentId)
95
+ elt.parent = Elt.find parentId
72
96
  end
73
97
 
74
98
  if not elt.parent
75
99
  parentId = "lost+found"
76
-
77
- elt.parent = Elt.find(parentId)
100
+ elt.parent = Elt.find parentId
78
101
  end
79
102
 
80
103
  rescue ActiveRecord::RecordNotFound
81
- elt.parent = elt.build_parent
104
+ elt.build_parent :parent_id => 'mail', :subject => parentId, :body => ''
82
105
  elt.parent.id = parentId
83
- elt.parent.parent_id = 'mail'
84
- elt.parent.subject = parentId
85
- elt.parent.body = ''
86
- elt.parent.save
106
+ elt.parent.save!
87
107
  end
88
108
 
89
- #elt.parent = Elt.find('mail') if not elt.parent
90
109
  mngAttachment(mail) if mail
91
110
 
92
111
  self.message = mail.message_id
93
112
  self.mail_parents = mail.references
94
113
  self.file = mail.encoded
114
+ elt.save!
115
+
116
+ if elt.body =~ /^\s*(-1|0|\+1)(\s*|$)/ then
117
+ #print '(', $`, ': ', Regexp.last_match(1), ')'
118
+ #puts
119
+ elt.parent.vote Regexp.last_match(1)
120
+ end
95
121
  end
96
122
 
97
123
 
@@ -102,17 +128,15 @@ class Mail < ActiveRecord::Base
102
128
  | .__/ \__,_|_.__/|_|_|___/_| |_|
103
129
  |_| """
104
130
  #
105
- # An elt has just been saved, and needs to be published as a mail
131
+ # An elt needs to be published as a mail
106
132
  #
107
133
  def publish
108
134
  logger.info "Publish mail"
109
135
 
110
136
  if message and not message.blank? and file
111
- mail = TMail::Mail.parse(file)
137
+ mail = TMail::Mail.parse file
112
138
  else
113
- logger.info "there"
114
- mail = MailNotify.create_publish(elt)
115
- logger.info "tehre"
139
+ mail = MailNotify.create_publish elt
116
140
  self.mail_parents = mail.references
117
141
  self.file = mail.encoded
118
142
  end
@@ -152,10 +176,8 @@ class Mail < ActiveRecord::Base
152
176
 
153
177
  # Added to make sure it is not lost, but not modified if already existant
154
178
  mail['X-Message-Id'] = mail.message_id if not mail['X-Message-Id']
155
-
156
179
  mail['X-leparlement-elt-Id'] = elt.id
157
180
 
158
-
159
181
  MailNotify::deliver(mail) if mail.destinations and not mail.destinations.empty?
160
182
 
161
183
  # Do it after sending, to get the actual message id as generated by the MTA
@@ -169,33 +191,29 @@ class Mail < ActiveRecord::Base
169
191
 
170
192
  private
171
193
 
172
- #
173
194
  # This is to make sure we only have utf-8, no iso-8859
174
- #
175
195
  def unquote(text)
176
- text.gsub(/\=\?.*?\?\=/) do |m|
177
- TMail::Unquoter.unquote_and_convert_to(m, 'utf-8')
178
- end
196
+ text.gsub(/\=\?.*?\?\=/) { |m| TMail::Unquoter.unquote_and_convert_to m, 'utf-8' }
179
197
  end
180
198
 
181
- #
182
199
  # Get and store the attachments
183
- #
184
200
  def mngAttachment(attachment)
185
201
  if attachment.content_type == 'text/plain'
186
- elt.body += attachment.body
187
- #elt.body += Iconv.new(attachment.type_param('charset'), 'iso-8859-15').iconv(attachment.body)
202
+ charset = attachment.type_param 'charset'
203
+ if charset and !charset.empty?
204
+ elt.body += Iconv.new(charset, 'utf-8').iconv(attachment.body)
205
+ else
206
+ elt.body += attachment.body
207
+ end
188
208
 
189
209
  elsif attachment.multipart?
190
- attachment.parts.each { |part| mngAttachment(part) }
191
-
192
- elsif attachment.type_param('name')
193
- file = File.new('/tmp/'+attachment.type_param('name'), 'w')
194
- file << attachment.body
195
- file.flush
210
+ attachment.parts.each { |part| mngAttachment part }
196
211
 
197
- attach = elt.attachments.build
198
- attach.file = file
212
+ elsif attachment.type_param 'name'
213
+ File.open('/tmp/'+attachment.type_param('name'), 'w') { |file|
214
+ file << attachment.body
215
+ elt.attachments.build :file => file
216
+ }
199
217
  end
200
218
  end
201
219
  end
@@ -70,11 +70,11 @@ class MailNotify < ActionMailer::Base
70
70
  # generated ids
71
71
  #
72
72
  def mailing_list(elt)
73
- e = elt
74
- while e.id.size > 21 and e.parent_id != 'ROOT'
75
- e = e.parent
73
+ if (elt.id.size > 21 and elt.parent_id != 'ROOT') then
74
+ mailing_list elt.parent
75
+ else
76
+ elt
76
77
  end
77
- e
78
78
  end
79
79
  end
80
80
 
data/app/models/person.rb CHANGED
@@ -2,6 +2,8 @@ class Person < ActiveRecord::Base
2
2
  usesguid
3
3
 
4
4
  has_many :elts
5
+ has_many :choices
6
+ has_many :issues, :through => :choices, :source => :elt
5
7
 
6
8
  validates_presence_of :name, :on => :create
7
9
  validates_length_of :name, :within => 3..40, :on => :create
@@ -6,6 +6,13 @@
6
6
  <%= error_messages_for 'user' if @user %>
7
7
 
8
8
  <% if @session[:person] %>
9
+ <span class="logout">
10
+ <%= link_to_remote('[X]',
11
+ :update => divId,
12
+ :url => { :controller => 'account', :action => 'logout', :divId => divId },
13
+ :complete => visual_effect(:BlindDown, divId)) %>
14
+ </span>
15
+
9
16
  <% if @session[:person].name and @session[:person].name != '' %>
10
17
  <span class="author">
11
18
  <%= link_to(@session[:person].name,
@@ -14,13 +21,6 @@
14
21
  :id => @session[:person]) %>
15
22
  </span>
16
23
  <% end %>
17
-
18
- <span class="logout">
19
- <%= link_to_remote('[X]',
20
- :update => divId,
21
- :url => { :controller => 'account', :action => 'logout', :divId => divId },
22
- :complete => visual_effect(:BlindDown, divId)) %>
23
- </span>
24
24
  <% else %>
25
25
 
26
26
  <%= render :partial => '/account/login', :locals => { :divId => divId } %>
@@ -1,7 +1,15 @@
1
1
  <% eltSubsNb = elt.children.count if eltSubsNb == nil %>
2
2
 
3
- <li id="elt_<%= elt.id %>" class="elt <%= displayTitle?(elt) ? 'titled' : '' %>">
4
- <% if eltTop or displayTitle? elt %>
3
+ <li id="elt_<%= elt.id %>" result="<%= elt.result %>"
4
+ class="elt <%= displayTitle?(elt) ? 'titled' : '' %>">
5
+ <span class="result"><%= sprintf("%+d", elt.result) %></span>
6
+ <!--
7
+ <form class="vote">
8
+ <label>-1</span> <span class="vote">0</span> <span class="vote">+1</span>
9
+ </form>
10
+ -->
11
+
12
+ <% if (eltTop or displayTitle? elt) and elt.created_on %>
5
13
  <span class="created_on">
6
14
  <%= elt.created_on.strftime('%d/%m/%y %H:%M') %>
7
15
  </span>
@@ -17,26 +25,19 @@
17
25
 
18
26
  <% if eltTop or displayTitle? elt %>
19
27
  <<%= eltTop ? 'h1' : 'h2' %>>
20
- <% if elt.id %>
28
+ <% if elt.new_record? %>
29
+ <%= textilize_without_paragraph(elt.subject) %>
30
+ <% else %>
21
31
  <%= link_to(textilize_without_paragraph(elt.subject),
22
32
  :controller => 'elt', :action => 'show', :id => elt) %>
23
- <% else %>
24
- <%= textilize_without_paragraph(elt.subject) %>
25
33
  <% end %>
26
34
  </<%= eltTop ? 'h1' : 'h2' %>>
27
35
  <% end %>
28
36
 
29
37
  <%= format elt.body %>
30
38
 
31
- <% for att in elt.attachments %>
32
- <%= link_to image_tag('/attachment/file/'+att.file_relative_path),
33
- '/attachment/file/'+att.file_relative_path %>
34
- <% end %>
35
-
36
- <!-- For IE -->&#160;
37
-
38
39
  <span class="eltQuickAdd" id="eltQuickAdd_<%= elt.id %>" title="<%= elt.created_on %>">
39
- <% if elt.id and elt.children.count == 0 %>
40
+ <% if !elt.new_record? and elt.children.count == 0 %>
40
41
  <%= link_to_remote('<span class="icon">&gt;&gt;</span>',
41
42
  { :update => 'eltNew_'+elt.id.to_s,
42
43
  :url => { :controller => 'elt', :action => 'new', :id => elt },
@@ -47,60 +48,65 @@
47
48
  <% end %>
48
49
  </span>
49
50
 
50
- <span class="eltSub">
51
- <!-- Display automatically one element threads -->
52
- <span <%= (eltTop or eltSubsNb < 2) ? 'style="display: none"' : '' %>
53
- class="eltMore" id="eltMore_<%= elt.id %>">
54
- <%= link_to_remote(eltSubsNb.to_s+' more',
55
- { :update => 'eltSubs_'+elt.id.to_s,
56
- :url => { :controller => 'elt', :action => 'list', :id => elt },
57
- :loading => visual_effect(:SwitchOff, 'eltMore_'+elt.id.to_s),
58
- :loaded => visual_effect(:BlindDown, 'eltSubs_'+elt.id.to_s)+
59
- visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
60
- { :href => url_for(:controller => 'elt', :action => 'show', :id => elt) }) %>
61
-
62
- <%= link_to_remote('Add <span class="icon">&gt;&gt;</span>',
63
- { :update => 'eltNew_'+elt.id.to_s,
64
- :url => { :controller => 'elt', :action => 'new', :id => elt },
65
- :loaded => visual_effect(:BlindDown, 'eltNew_'+elt.id.to_s)+
66
- visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
67
- { :href => url_for(:controller => 'elt', :action => 'new', :id => elt)}) %>
68
- </span>
69
-
70
- <span <%= (eltTop or eltSubsNb == 1) ? '' : 'style="display: none"' %>
71
- id="eltSubs_<%= elt.id %>">
72
- <% if eltTop or eltSubsNb == 1 %>
73
- <%= render :partial => '/elt/list', :locals => { :elt => elt } %>
74
- <% end %>
75
- </span>
51
+ <% for att in elt.attachments %>
52
+ <%= link_to image_tag('/attachment/file/'+att.file_relative_path),
53
+ '/attachment/file/'+att.file_relative_path %>
54
+ <% end %>
76
55
 
77
- <span style="display: none" class="eltNew" id="eltNew_<%= elt.id %>">
78
- &nbsp;
79
- </span>
80
- </span>
56
+ <!-- For IE -->&#160;
81
57
 
82
- <span <%= ((eltTop and eltSubsNb > 0) or eltSubsNb == 1) ? '' : 'style="display: none"' %>
83
- id="eltSubsClose_<%= elt.id %>" title="<%= elt.created_on %>"
84
- class="eltSubsClose">
85
- <%= link_to_function('<span class="icon">&lt;&lt;</span> Close',
86
- visual_effect(:BlindUp, 'eltSubs_'+elt.id.to_s)+
87
- visual_effect(:BlindUp, 'eltNew_'+elt.id.to_s)+
88
- visual_effect(:BlindUp, 'eltSubsClose_'+elt.id.to_s)+
89
- visual_effect(:BlindDown, 'eltMore_'+elt.id.to_s)) %>
90
-
91
- <% if elt.person %>
92
- <%= link_to(elt.person.name,
93
- :controller => 'person', :action => 'show', :id => elt.person) %>
94
- <% elsif not displayTitle? elt %>
95
- <%= ANONYMOUS_POSTER %>
96
- <% end %>
58
+ <span <%= (eltTop or eltSubsNb < 2) ? 'style="display: none"' : '' %>
59
+ class="eltMore" id="eltMore_<%= elt.id %>">
60
+ <%= link_to_remote(eltSubsNb.to_s+' more',
61
+ { :update => 'eltSubs_'+elt.id.to_s,
62
+ :url => { :controller => 'elt', :action => 'list', :id => elt },
63
+ :loading => visual_effect(:SwitchOff, 'eltMore_'+elt.id.to_s),
64
+ :loaded => visual_effect(:BlindDown, 'eltSubs_'+elt.id.to_s)+
65
+ visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
66
+ { :href => url_for(:controller => 'elt', :action => 'show', :id => elt) }) %>
97
67
 
98
68
  <%= link_to_remote('Add <span class="icon">&gt;&gt;</span>',
99
69
  { :update => 'eltNew_'+elt.id.to_s,
100
70
  :url => { :controller => 'elt', :action => 'new', :id => elt },
101
71
  :loaded => visual_effect(:BlindDown, 'eltNew_'+elt.id.to_s)+
102
- visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
72
+ visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
103
73
  { :href => url_for(:controller => 'elt', :action => 'new', :id => elt)}) %>
104
74
  </span>
75
+
76
+ <ul class="eltSubs">
77
+ <!-- Display automatically one element threads -->
78
+ <div <%= (eltTop or eltSubsNb == 1) ? '' : 'style="display: none"' %>
79
+ id="eltSubs_<%= elt.id %>" class="eltSub">
80
+ <% if eltTop or eltSubsNb == 1 %>
81
+ <%= render :partial => '/elt/list', :locals => { :elt => elt } %>
82
+ <% end %>
83
+ </div>
84
+
85
+ <span style="display:none" class="eltNew" id="eltNew_<%= elt.id %>"></span>
86
+
87
+ <span <%= ((eltTop and eltSubsNb > 0) or eltSubsNb == 1) ? '' : 'style="display: none"' %>
88
+ id="eltSubsClose_<%= elt.id %>" title="<%= elt.created_on %>"
89
+ class="eltSubsClose">
90
+ <%= link_to_function('<span class="icon">&lt;&lt;</span> Close',
91
+ visual_effect(:BlindUp, 'eltSubs_'+elt.id.to_s)+
92
+ visual_effect(:BlindUp, 'eltNew_'+elt.id.to_s)+
93
+ visual_effect(:BlindUp, 'eltSubsClose_'+elt.id.to_s)+
94
+ visual_effect(:BlindDown, 'eltMore_'+elt.id.to_s)) %>
95
+
96
+ <% if elt.person %>
97
+ <%= link_to(elt.person.name,
98
+ :controller => 'person', :action => 'show', :id => elt.person) %>
99
+ <% elsif not displayTitle? elt %>
100
+ <%= ANONYMOUS_POSTER %>
101
+ <% end %>
102
+
103
+ <%= link_to_remote('Add <span class="icon">&gt;&gt;</span>',
104
+ { :update => 'eltNew_'+elt.id.to_s,
105
+ :url => { :controller => 'elt', :action => 'new', :id => elt },
106
+ :loaded => visual_effect(:BlindDown, 'eltNew_'+elt.id.to_s)+
107
+ visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s)},
108
+ { :href => url_for(:controller => 'elt', :action => 'new', :id => elt)}) %>
109
+ </span>
110
+ </ul>
105
111
  </li>
106
112
 
@@ -6,10 +6,6 @@ e = Elt.find_all("parent_id = '#{elt.id}'",
6
6
  'created_on DESC', e_pages.current.to_sql)
7
7
  %>
8
8
 
9
- <%
10
- # TODO There seems to be a problem with firefox when trying to use a visual_effect
11
- %>
12
-
13
9
  <%= link_to_remote('< Previous page',
14
10
  { :update => 'eltSubs_'+elt.id.to_s,
15
11
  :url => { :action => 'list', :id => elt, :page => e_pages.current.next },
@@ -34,7 +30,29 @@ e = Elt.find_all("parent_id = '#{elt.id}'",
34
30
  { :href => url_for(:controller => 'elt', :action => 'show', :id => @elt,
35
31
  :page => (@params['page'] ? @params['page'].to_i-1 : e_pages.length-1))}) if e_pages.current.previous %>
36
32
 
37
- <ul class="eltSubs" style="padding: 0; margin: 0;">
38
- <%= render :partial => '/elt/elt', :collection => e.reverse, :locals => { :eltTop => false } %>
39
- </ul>
33
+ <%= render :partial => '/elt/elt', :collection => e.reverse, :locals => { :eltTop => false } %>
34
+
35
+ <%= link_to_remote('< Previous page',
36
+ { :update => 'eltSubs_'+elt.id.to_s,
37
+ :url => { :action => 'list', :id => elt, :page => e_pages.current.next },
38
+ :loading => visual_effect(:BlindUp, 'eltSubs_'+elt.id.to_s),
39
+ :complete => visual_effect(:BlindDown, 'eltSubs_'+elt.id.to_s)+
40
+ visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s) },
41
+ { :href => url_for(:controller => 'elt', :action => 'show', :id => @elt,
42
+ :page => (@params['page'] ? @params['page'].to_i+1 : 2))}) if e_pages.current.next %>
43
+
44
+ <% if e_pages.length > 1 %>
45
+ <span class="pageCount">
46
+ (<%= e_pages.length-e_pages.current.to_i+1 %>/<%= e_pages.length %>)
47
+ </span>
48
+ <% end %>
49
+
50
+ <%= link_to_remote('Next page >',
51
+ { :update => 'eltSubs_'+elt.id.to_s,
52
+ :url => { :action => 'list', :id => elt, :page => e_pages.current.previous },
53
+ :loading => visual_effect(:BlindUp, 'eltSubs_'+elt.id.to_s),
54
+ :complete => visual_effect(:BlindDown, 'eltSubs_'+elt.id.to_s)+
55
+ visual_effect(:BlindDown, 'eltSubsClose_'+elt.id.to_s) },
56
+ { :href => url_for(:controller => 'elt', :action => 'show', :id => @elt,
57
+ :page => (@params['page'] ? @params['page'].to_i-1 : e_pages.length-1))}) if e_pages.current.previous %>
40
58